개요 Spring Boot, JPA 환경에서 개발하다보면 JPA의 멋진 철학에 매료되었다가 곧 현실과의 괴리를 느끼고, 끊임없는 내적 갈등에 휩싸이게 된다. 그런 상황을 유발하는 대표적인 예외가 바로 LazyInitializationException인데 이번 글에서는 해당 예외가 발생하는 이유와 해결책을 정리하였다. LazyInitializationException 예외가 발생하는 이유 일반적인 백엔드 프로젝트에서 로직의 대부분은 REST API에 해당하며 실행의 흐름은 @Controller, @Service, @Repository 순서가 된다. 서비스 레벨에서 @Transactional이 명시된 메써드가 종료되면 Hibernate의 Session도 함께 종료된다. FetchType.LAZY가 설정된 필..
개요 Spring Boot 기반의 REST API를 설계할 경우, 예외 상황에 대한 응답 구조 설계에 있어 신중한 접근이 요구된다. 프로젝트 초기에 충분한 고민 없이 무작정 오류 응답을 처리하게 되면, 참여 개발자가 늘어날수록 자기 입맛에 따라 그 때 그 때 다른 구조로 응답하여 예외를 통제하기가 매우 힘들어진다. (나는 이런 사례를 Exception Hell이라고 부른다.) 이번 글에서는 철저히 통제된 예외 응답 구조를 설계하는 방법을 설명하고자 한다. Spring Boot의 기본 에러 응답 Spring Boot의 요청 처리 과정에서 어떠한 설정도 하지 않은채 예외가 발생하면 아래 형식으로 오류를 응답한다. # 400 BAD_REQUEST { "timestamp": 1500597044204, "stat..
개요 JBoss Infinispan에 대해서는 본 블로그의 이 글에서 자세히 소개한 적이 있다. 이번 글에서는 여러 캐시 라이브러리가 공존하는 복잡한 프로젝트 환경에서 JBoss Infinispan을 추가하고, Spring Cache와 JCache를 연동하는 방법을 정리하였다. Spring Cache 적용 원리 프로젝트의 @Configuration 빈의 클래스 레벨에 @EnableCaching을 명시하면, 전처리기가 활성화되어 모든 스프링 빈의 퍼블릭 메써드 레벨에 명시된 @Cacheable, @CachePut, @CacheEvict를 확인하여 캐시가 작동하게 된다. 스프링 캐시는 별도의 설정을 하지 않고 활성화할 경우, 단순히 CuncurrentHashMap 오브젝트를 캐시로 사용하게 된다. Infin..
개요 Spring Boot 생태계에서 콘솔 애플리케이션을 만드는 방법은 다양하지만, 내가 선호하는 방법을 정리하였다. (대부분은 팀 내부에서 사용하는 유틸리티 성격의 툴링이 목적이다.) build.gradle.kts 웹 애플리케이션이 아닌 한 번 실행되면 준비된 기능을 실행하고 종료되는 애플리케이션을 만들 것이기 때문에 spring-boot-starter이면 충분하다. dependencies { implementation("org.springframework.boot:spring-boot-starter") } @SpringBootApplication 클래스 작성 커맨드라인 인자를 다루면 좋겠지만 팀 내에서만 사용할 것이기에 운영체제 환경 변수 주입을 더 선호한다. import org.springframe..
- Total
- 3,095,574
- Today
- 345
- Yesterday
- 953
- spring
- DynamoDB
- Eclipse
- CentOS
- Kendo UI Web Grid
- Kendo UI
- Spring Boot
- node.js
- 자전거
- 로드바이크
- Spring MVC 3
- kotlin
- 구동계
- maven
- MySQL
- JavaScript
- 로드 바이크
- 알뜰폰
- Docker
- 평속
- bootstrap
- chrome
- JHipster
- jpa
- Tomcat
- jstl
- java
- jsp
- graylog
- 태그를 입력해 주세요.