스프링 타입 컨버터 문자를 숫자로 변환하거나, 숫자를 문자로 변환해야하는 것처럼 애플리케이션에서 개발하다보면 타입을 변환해야 하는 경우가 상당히 많다. 이 때 스프링 타입 컨버터를 사용한다. 프로젝트 생성 다음과 같이 spring.io 에서 프로젝트를 생성하자. 스프링 타입 컨버터 소개 package hello.typeconverter.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @RestController public class ..
서블릿 API 예외 처리 package hello.exception.sevlet; import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; @Component public class WebServerCustomizer implements WebSer..
프로젝트 생성 다음과 같이 스프링 프로젝트를 생성하자. 서블릿 예외 처리 스프링 사용되기 이전에 순수 서블릿 컨테이너는 예외를 어떻게 처리하는 지 알아보자. 서블릿은 Exception, response.sendError(Http 상태 코드, 오류 메시지) 총 2가지 방식으로 예외 처리를 지원한다. Exception 자바 직접 실행 자바의 메인 메서드를 직접 실행하는 경우 main이라는 쓰레드가 실행된다. 실행 도중에 예외를 잡지 못하고 처음 실행한 main 메서드를 넘어서 예외가 던져지게 된다면, 예외 정보를 남기고 해당 쓰레드는 종료된다. 웹 애플리케이션 웹 애플리케이션은 사용자 요청별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행된다. 예외를 처리하지 않고 서블릿 컨테이너를 넘게되면 어떻게..
쿼리 메서드 기능 메서드 이름으로 쿼리 생성 NamedQuery @Query 파라미터 바인딩 반환 타입 페이징과 정렬 벌크성 수정 쿼리 @EntityGraph JPA 공식문서 : https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation Spring Data JPA는 다음과 같이 여러 쿼리 메서드 기능을 제공한다. 순수 JPA 테스트 코드 public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :u..
공통 인터페이스 기능 순수 JPA 기반 리포지토리 스프링 데이터 JPA 공통 인터페이스 소개 및 활용 순수 JPA 기반 리포지토리 JPA에서 수정은 변경감지 기능을 사용하면 된다. 트랜잭션 안에서 엔티티를 조회한 다음에 데이터를 변경하면, 트랜잭션 종료 시점에 변경감지 기능이 작동해서 변경사항이 있으면 UPDATE SQL을 실행한다. package study.datajpa.repository; import org.springframework.stereotype.Repository; import study.datajpa.entity.Member; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; impor..
프로젝트 환경 설정 프로젝트 생성 https://start.spring.io/ 에서 다음과 같이 프로젝트 생성 라이브러리 spring-boot-starter-web 톰캣, 스프링 웹 MVC spring-boot-starter-data-jpa aop, jdbc (HikariCP 커넥션 풀) , 하이버네이트 JPA, 스프링 데이터 JPA spring-boot-starter 스프링 부트 + 스프링 코어 + 로깅 spring-boot-starter-test junit5 (기본) , mokito, assertj, spring-test plugins { id 'org.springframework.boot' version '2.6.8' id 'io.spring.dependency-management' version ..
QueryDSL 실무에서는 조건에 따라서 실행되는 쿼리가 달라지는 동적 쿼리를 많이 사용한다. 이전 방법 public List findAllByString(OrderSearch orderSearch) { //language=JPAQL String jpql = "select o From Order o join o.member m"; boolean isFirstCondition = true; //주문 상태 검색 if (orderSearch.getOrderStatus() != null) { if (isFirstCondition) { jpql += " where"; isFirstCondition = false; } else { jpql += " and"; } jpql += " o.status = :status"..
OSIV 전략 OSIV 란 Open Session In View 라는 하이버네이트 전략이며, JPA에선 Session 대신 EntityManager 지만 관례상 통합해서 OSIV라고 부른다. OSIV ON 스프링 부트를 시작 시점에 다음과 같은 warn 로그로 남는다. 그 이유는 spring.jpa.open-in-view가 기본 값이 true로 설정되어 있기 때문이다. OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 그래서 지금까지 View Template이나 API 컨트롤러에서 지연 로딩이 가능한 것이다. 지연로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 데이터베이스 커넥션을 유지한..