알고리즘 문제를 풀면 BFS문제가 많이 출제가 되는 것을 알 수 있다. BFS의 사전적 정의를 생각해보면 Breadth-First Search 너비 우선 검색으로 너비를 우선적으로 검색하는 알고리즘이다. 너비를 구한다는 것이 무슨 말일까? 간단히 생각해서 범위를 확장을 시킨다는 의미다. 확장을 시키려면 어떻게 하는것이 가장 효율적일까? 이것도 생각할 문제이긴 하지만 일반적으로 가장 효율적인 방식은 바이러스 처럼 점염을 시키는 것이 가장 빠를 것이다. 최근에 발생한 바이러스는 코로나바이러스다. 코로나 바이러스의 감염 방식은 여러가지가 있지만, 내가 생각할때 코로나 바이러스가 빠르게 확산을 시킬 수 있었던건 근처에 있는 사람에게 공기중으로 감염이 된것이 빠르게 확산을 시킨 이유가 아닐까 싶다. 이걸 다른 말..
블로그글을 안쓴지 1년이 넘어간다. 사실 이렇게 까지 운영을 안하려고 했던건 아니였는데 어쩌다보니 이렇게 되었다. 지금까지 나는 개발자라는 직업으로 발전을 시킬 수 있을지 고민을 했다. 어떻게 하면 더 잘 할 수 있을지.. 하지만 올해는 아니였다. 개발자에 대한 능력을 키우는 것보다 내 자신에 대해 조금더 심도 깊게 생각할 시간이 필요했다. 결론부터 말하자면 의미가 없었다. 더 정확히 말하면 완전히 의미는 없지는 않는건 아니지만 글로 적기에 애매한 거 같다, 올해는 정말 미치는 듯이 놀았다. 적금도 최소한으로 하고.. 놀 수 있으면 놀고 그랬다. 공부는 하지 않고 놀았다. 올해 처음으로 해외여행도 갔다. 비록 혼자가긴 했지만 아무튼 좋았다. 뭐가 좋은지에 대해서는 적지는 않겠지만 아무튼 좋았다. 솔직히 ..
"한빛미디어 활동을 위해서 책을 제공받아 작성된 서평입니다." 이 책으로 디자인패턴을 공부를 처음 시작했는데 가장 좋았던 점은 어떤 패턴인지 직관적으로 설명하는 것이 가장 좋았습니다. 마치 패턴과 내가 대화를 하는듯한 느낌을 주는 느낌을 받았습니다. 이건 여담인데 제가 회사 면접때 디자인 패턴을 공부한적이 있다고 했고 특정 패턴에 대해 설명한적이 있었습니다. 그때 설명한 패턴이 어뎁터 패턴이었습니다. 저는 그 회사에 합격을 해서 지금도 잘 다니고 있습니다. 이것을 갑자기 말한 이유는 아마 제 합격이 가능한것은 이 책의 지분이 어느정도 있다고 생각합니다. 실제로 입사를 했을때 보다 먼저 구입을 하였습니다. 근데 이 책의 가장 큰 단점이 있었는데 그건 바로 너무 책 표지가 올드하다는 점입니다. 제가 이 책을..
Spring data JPA에서는 많은 확장 기능을 제공하고 있다. 사용자 정의 리포지토리 구현 (잡 글) 일반적으로 Spring data JPA에서는 public interface MemberRepository extends JpaRepository {} 인터페이스를 통해서 JPA를 사용하고 있다. 근데 마이바티스 나 네이티브 쿼리를 사용하는 경우 위 인터페이스는 의미가 없어진다. 왜냐하면, JPA에서 이들을 관리할 수 없기 때문이다. 결국 이들을 사용할때 엔티티와 테이블간의 간극이 발생할 수 있다는 건데 이를 해결하는 방안으로는 강제로 영속성 컨텍스트를 초기화를 시켜줘야 가능하다. 그러면 위 인터페이스를 이용하면 어떨까? 결론부터 말하면 굉장히 비효율적이다. 아까도 말했듯이 마이바티스나 네이티브 쿼리..
페이징 기능 JPA에서 페이징을 할려면, public List findByUsernameAndAgeGraterThen(String username, int age) { return em.createQuery("select m from Member m where m.userName =:username and m.age >:age") .setFirstResult(1) .setMaxResults(10) .getResultList(); } 이런식으로 first와 max를 지정해야 할 수 있다. 코드 상에서는 하드코딩으로 박아두고 있지만, 이것을 밖으로 빼면 될거다. 근데 문제 가 있다. 그건 바로 전체값을 알 수 없다는 점이다. 결국 계산해야 된다는 건데 솔직히 말하면 귀찮다. 이것을 spring data JP..
springData에서는 인테페이스를 통해서 쿼리를 작성한다. public interface MemberRepository extends JpaRepository { } 이상하다. 분명히 아무것도 없는데 이렇게만해도 기본적인 insert라던지 delete update가 전부 된다. (update같은 경우는 jpa의 특별한 방법을 사용하고 있다.) @Override public List findAll() { return getQuery(null, Sort.unsorted()).getResultList(); } 요런식으로 미리 구현되어 있다. 그래서 비슷하게 만들려고 했지만, 잘 만들어지지 않았다. 이걸 만드는게 중요한게 아니기 때문에 넘어가자. @Override public T getById(ID id) ..
인터페이스는 과연 무엇일까? interface?? 초기의 인터페이스는 void test(); 요런식으로 구현체가 없는 상태로 존재하였다. 그래서 인터페이스를 implements을 하게되면, 구현체가 반드시 필요하였습니다. 하지만 자바8부터 인터페이스에도 구현체를 작성할 수 있게 되었다. 구현체를 작성하는 방법은 총 3가지다. 1. static 2. default 3. private 원래 언제 만들어졌는지 적으려 했지만 귀찮은 관계로 넘어가자. 아무튼 이 3가지의 공통점은 구현체를 구현을 해야 된다는 점이다. 근데 여기서 드는 의문점이 있다. static, private같은 경우는 기존 클래스에서 사용법이 크게 다르지 않다. static은 메모리상에 먼저 올라가구 private는 그 클래스내에서만 사용이 ..
오랜만에 디자인 패턴을 공부하는 것 같다. 이 패턴에 대해 간략하게 설명하자면, 공통 부분을 미리 만들어 놓고 그것을 가져다 쓰는 방식이다. 이 패턴은 상속을 통해 이뤄진다. 상속? 상속을 사용한다는 뜻은 부모와 자식의 관계가 명확하다는 이야기다. 즉, 부모쪽에 공통 부분을 뽑아 내고 자식 쪽에서 그것을 오버라이딩 하는 것이다. 예제를 고민해봤는데 생각보다 쉽지 않을 것 같다. 간단하게 숫자를 계산하는 계산기를 만들어 보려구 한다. 시작 public int calculate() { return get(1, 2, 3, 4); } private int get(int... numbers) { int result = 1; for (int number : numbers) { result *= number; } r..
rollup vs cube vs grouping set 공부를 하면서 이 3가지가 굉장히 헷갈렸다. 특히 group by가 2~3개 이상 섞여있을 때 굉장히 문제를 해결하기 어려웠다. 이들을 쉽게? 해결하는 방법은 갯수를 세어 보는 방법이다. 예시 쿼리를 보여주고 싶기는 한데 그거까지 하기에는 조금 귀찮은 감이 조금 있어서 그거는 생략하도록 한다. c1 c2 count A 1 1 A 2 1 A 2 B 1 1 B 2 2 B 3 테이블이 이렇게 되있다고 생각해보자. 그럼 제일 먼저 해야 할 일은 count가 어떻게 들어 오는지 파악해야 한다. 확인 결과 (c1,c2) => A,1 이 1개라는 것을 알 수 있다. 이렇다는 것으로 미뤄봤을때 group by는 c1과 c2둘다 해당 된다는 것을 알 수 있다. 근데..
sql null SQL에서 NULL을 활용하는 방법은 무수히 많습니다. count(*)이거랑 count(칼럼명) 이 두 개는 값이 다릅니다. 전자같은 경우는 null을 포함해서 계산을 하게 되고 후자는 null을 포함하지 않는 상태에서 계산 되어집니다. 또한, null은 어떤 값과 연산을 하여도 무조건 null이 나오는 특징을 가지고 있습니다. null 관련 함수 nvl(값1, 값2); 값1이 null인 경우 값1 아닌 경우 값2 nullif(값1, 값2) 값1 = 값2인 경우 null 다른 경우 값1 coalesce(값1,값2,값3...) 최초로 null이 아닐때까지 반복 오라클에서는 null이 가장 무겁지만 mssql 에서는 null이 가장 가볍다. sql 읽는 순서 (중요) sql를 읽을때 가장 먼..
SQLD문제를 풀다가 문제가 생각보다 쉽지 않아 블로그에 올려서 공부할려구 한다. SQLD 특성상 sql쿼리를 보고 결과를 유추할 수 있어야 한다. FULL OUTER JOIN같은 경우도 이론은 알고 있는데 막상 문제로 보니 쉽지 않았다. 그래서 그림으로 그려서 이해시킬려구 한다. 다음과 같은 데이터가 준비되었다. INSERT INTO TB_DEPT_52 (DEPT_NO, DEPT_NM) VALUES ('D101','데이터개발팀'); INSERT INTO TB_DEPT_52 (DEPT_NO, DEPT_NM) VALUES ('D102','파이개발팀'); INSERT INTO TB_DEPT_52 (DEPT_NO, DEPT_NM) VALUES (NULL,'자바개발팀'); INSERT into tb_emp_52..