본문 바로가기

Back-End

(61)
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..
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..
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 ) 메서드 실..
6.8장 - 트랜잭션 지원 테스트
6-6. 트랜잭션 속성 이전 포스팅에서 스프링의 트랜잭션 추상화를 설명하면서 넘어간게 하나 있다. 트랜잭션 매니저에서 트랜잭션을 가져올 때 사용한 DefaultTransactionDefinition 오브젝트다. 트랜잭션 정의 더 이상 쪼갤 수 없는 최소 단위의 작업이라는 점에서 모두 같은 개념이지만, 트랜잭션의 동작방식을 제어할 수 있는 다른 몇가지 조건이 있다. 트랜잭션 전파 ( Transaction Propagation ) 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할지 결정하는 방식 예제 : A 트랜잭션이 끝나지 않은 시점에서 B를 호출했다면 B는 어떤 트랜잭션 안에서 동작할까? A+B 하나의 트랜잭션으로 처리 : (2)에서 에러가 나면 B도 롤백이 된다. A / B 별도의 트랜잭션으..
Spring MVC에 관하여 Spring MVC 요청 흐름 개요 사용자가 요청( URL + parameters )을 서버에게 날린다. DispatcherServlet이 처음에 이 요청을 받는다. DispatcherServlet은 미리 설정되어 있는 Handlermapping 정보(web.xml or @Controller)를 통해 request를 Handler에게 위임(delegate)한다. Handler(Controller)에서 비즈니스 로직을 처리 한다. 그 결과에 View와 관련된 정보가 있다면 DispatcherServlet은 ViewResolver를 통해 view에 대한 정보를 받아온다. DispatcherServlet은 받아온 View와 Model을 통해 render을 하고 이를 브라우저에 돌려준다. Filter는 무엇을 ..