본문 바로가기

Happyer16

(221)
N+1 문제 해결하기 ( fetch join, @EntityGraph ) 댓글과 대댓글을 조회하는 API를 개발하였는데, 검색이 비이상적으로 오래 걸려 Query문을 다시 봤다. 1. 기존 Query @Query(value = "SELECT c FROM Comment c WHERE c.goodsId = ?1 AND c.id = c.parentIdx " + "AND c.memberName not in ?2 ORDER BY c.regDate DESC, c.commentRate DESC ") Page findCommentsByGoodsIdExcludeAdminComment(Long goodsId, Collection excludeMembers, Pageable pageable); Hibernate: select comment0_.good_comment_idx as good_com1..
10. Exceptions ( 예외 처리 ) - Effective Java 3th 예외처리는 적절하게 사용하면 가독성, 안정성이 올라가지만, 적절하게 사용하지 않으면 오히려 잘못된 길로 가게 된다. Item 69. 예외 상황을 위해서만 예외처리를 하여라. // Horrible abuse of exceptions. Don't ever do this! try { int i = 0; while(true) range[i++].climb(); } catch (ArrayIndexOutOfBoundsException e) { } 위의 코드는 결국 range 범위를 넘어가면 exception을 발생시킬 것이다. 하지만 이 코드는 결국 아래와 같다. for (Mountain m : range) m.climb(); Exception은 이름 그대로, 예외 상황을 위해서만 사용되어야지 원래 control ..
Spring boot 테스트하기 Spring boot에서 unit & integration 테스트하기 Java Test Unit 자바에서 대표적인 테스트 프레임워크는 JUnit이다. 결과를 확인하기 위한 matcher를 지워하는 Hamcrest 프레임워크도 있다. 아래는 다양한 사용방법이다. public class AssertTests { @Test public void testAssertEquals() { assertEquals("failure - strings are not equal", "text", "text"); } @Test public void testAssertFalse() { assertFalse("failure - should be false", false); } @Test public void testAssertNo..
Spring - Unable to acquire JDBC Connection 이슈 잘 되던 서비스가 갑자기 Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms. 위와 같은 에러를 내었다. JDBC connection을 못가져온다고?? 그래서 위에 로그를 봤더니 30초가 지나도록 connection을 못가져오고 있었다. 왜 이럴까? org.s..
Git 유용한 기능들 생각없이 git push, pull 정도만 사용해왔지 git에 대해 조금 더 공부해야 함을 느꼈다. 그래서 유용한 기능들에 대해 정리해보겠다. 혹시나 제가 모르는 유용한 기능들이 있다면 댓글로 남겨주세요~~ Git log 관련 기능들 커밋 히스토리를 조회할때 많이 사용하는 것중 하나는 특정 변화 추적이 아닐까 싶다. 아래 명령어는 'messageSource'라는 함수가 추가되거나 제거된 커밋을 찾고, 변화된 내용을 보여주는 것이다. git log -p -S {찾고 싶은 string} git log -p -S messageSource git add -i 대화형 명령 대화형 명령을 적용할 수 있는 옵션이다. 하지만 이건 정리하지 않으려 한다. 왜냐하면 이렇게 치는거보다 개인적으로 Sourcetree와 같은 ..
7장. 스프링 핵심 기술의 응용 앞 장에서 스프링의 3대 핵심 기술인 IoC/DI, 서비스 추상화, AOP에 대해 살펴봤다. 스프링의 모든 기술은 결국 자바의 핵심 가치인 객체지향 적인 코드를 작성할 수 있도록 도와주는 것이다. 스프링을 사용하는 개발자라면 당연히 스프링이 제공해주는 3가지 기술을 필요에 따라 스스로 응용할 수 있어야 한다.
7.4. 인터페이스 상속을 통한 안전한 기능확장 서버가 운영중인 상태에서 사용 중인 SQL을 변경해야 한다면? 이렇게 기존의 기능에 발전돼야 할 경우 스프링에서는 어떻게 접근하는지에 대해 알아보자. DI와 기능의 확장 스프링의 DI 프레임워크를 쓴다고 해서 DI를 바르게 활용한다고 볼 수 없다. 스프링에서 DI를 쓰는건 어렵지 않은 일이다. 하지만 DI의 가치를 제대로 얻기위해 DI에 적합한 오브젝트 설계는 쉽지 않다. 그렇다면 DI의 가치를 얻기위해서는 어떻게 하는게 좋을까? 객체지향 설계를 하면서 DI를 의식하면서 설계를 하는 것도 좋은 방식이다. DI와 interface 프로그래밍 인터페이스를 통해 다형성을 얻을 수 있고, 유연하고 확장성 높은 설계가 가능해진다. 앞장에서 우리는 아래처럼 설계를 해왔다. 이제 여기에서 이미 등록된 SQL을 변경할..
7.2. 인터페이스의 분리와 자기참조 빈 & 7.3. 서비스 추상화 적용 SQL을 읽어오는 작업을 시작해보자. SqlService라는 인터페이스를 만들고 구현하면 끝일까? 이는 인터페이스를 사용하는 척만 하고 구현체에 방대한 서브시스템을 몰아넣게 될 것이다. 변화를 위한 준비 : 인터페이스 분리 1) XML에서 SQL 데이터를 가져오고 2) HashMap 맵 오브젝트에 저장을 해두는 XmlSqlService를 잘 만들었다. 하지만, 스프링의 유연한 확장구조를 경험한 개발자라면 당연히 수정을 해야한다. 만약, XML 대신 다른 포맷의 파일에서 SQL을 읽어온다면? XmlSqlService를 뜯어 고쳐야 한다. 다른 ...SqlService를 똑같이 만든다면 코드의 중복이 일어날테고, 그렇다고 XmlSqlService를 뜯어고치는 것도 잘못된 방법이다. 왜냐하면 수정되는 이유가 ..
7.6 스프링 3.1 DI & 7.7 정리 스프링 프레임워크가 나온지가 어느덧 8년이 되었다. 스프링 1.0에서 3.1까지 나오면서 완벽에 가까울 만큼 하위 호환성을 가지고 있다고 한다. 이는, 스프링에서 항상 얘기하는 DI 패턴을 스스로 잘 지켰기 때문이다. 스프링 3.1에 이르러서는 1. 핵심 로직을 담은 자바 코드 2. DI 프레임워크 3. DI를 위한 메타데이터로서의 자바 코드 ( 구버전 때 XML ) 크게 이렇게 3가지로 구성 되어 있다. 컨텍스트 분리와 @Import 이전 예제까지는 DI 정보와 테스트를 수행하기 위해 만든 DI 정보가 하나의 파일 안에 혼재해 있다. 결국, 성격이 다른 코드 분리에 실패한 것이다. 이제 DI 정보를 분리해보자. 테스트에서 사용할 빈정보를 다른 클래스로 분리했으니 완벽한 코드일까? 빈의 내용을 보면 SQ..
AOP란 비즈니스 로직(모듈)은 가로로 배치하고 공통으로 적용시킬 보안, 로깅, DB처리 로직은 세로로 관통하는 모습이다. AOP의 구조와 용어정리 Aspect : AOP에서 관점이라 부르며 여러 객체에 공통으로 적용되는 기능을 담당 Advice : Aspect를 적용할 조건을 담당. 보안기능이 어떤 메소드에 적용할지, 예외 발생 후 동작할 건지 조건을 걸어준다. ( 모듈자체 - What ) Pointcut : 공통기능을 어떤 모듈의 Joinpoint 통과할건지 위치를 지정해주는 역할 Joinpoint : 공통기능이 적용 가능한 포인트들 메서드 실행 전 ( before ) 메서드 실행 후 ( after ) 반환된 후 ( afterReturning ) 예외가 던져지는 시점 ( afterThrowing ) 메서드 실..