Spring
spring.config.import 설정으로 env 파일을 읽을 때 생길 수 있는 오류
spring: config: import: - optional:file:env/dev-db.env datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: ${DB_URL} username: ${DB_USERNAME} password: ${DB_PASSWORD} jpa: database: mysql database-platform: org.hibernate.dialect.MySQL8Dialect open-in-view: false properties: hibernate: show_sql: true format_sql: true 위와 같이 env 파일을 읽어와서 사용하려고 하였는데 아래와 같은 에러가 발생했다. Caused by: java.lang.Ill..
스케줄링, 배치로 S3 이미지 삭제 처리
개요 현재 제가 진행하고 있는 프로젝트에서는 이미지 삭제를 hard delete 로 처리하고 있습니다. 주문글, 댓글 등 다른 엔티티들은 모두 soft delete로 처리하는데 이미지만 hard delete 를 하고 있는 이유가 무엇일까요? 우선 soft delete를 사용하는 이유는 삭제된 데이터를 복구해야 할 일이 생길 수도 있고, 데이터 자체를 활용하여 추후 기능 개발에 활용할 수도 있기 때문입니다. 즉, 데이터가 서비스의 자산이기 때문입니다. 현재 제 프로젝트에서는 이미지를 독립적인 엔티티로 관리하고 있는데, 이미지를 soft delete 를 해야하는 이유가 크게 없습니다. S3와 같은 스토리지에서는 삭제를 하고 DB 에서는 soft delete 된 상태로 놓아 두는 것은 의미가 없고, S3 에서..
Spring 의 예외 처리 방법
WAS 의 예외 처리 방식 우선적으로 서블릿 컨테이너가 예외 처리를 하는 방식을 알아야합니다. 서블릿 컨테이너는 2가지 방식으로 예외를 처리합니다. Exception 을 처리. response.sendError(상태코드, 메세지) 를 처리. 1. Exception 을 처리하는 경우 WAS(서블릿 컨테이너) ← 필터 ← 서블릿 ← 인터셉터 ← 컨트롤러 의 흐름으로 진행됩니다. 컨트롤러에서 발생한 Exception 이 처리되지 않고 다시 WAS 까지 올라온다면 500 에러로 처리되고 WAS 자체의 오류 페이지를 화면에 보여줍니다. 2. response.sendError() 를 처리하는 경우 컨트롤러에서 response.sendError() 를 호출한 경우에는 Exception 이 발생하는 것은 아니지만 서블..
Spring DI 란?
Spring DI 란? DI 란? 구체적인 구현체에 의존하지 않고 추상화된 객체에 의존하게 하여 결합도을 낮추는 것. 구현체에 의존하게 되면 사용하는 구현체가 변경되었을 때 구현체를 사용하는 코드의 변경이 생기게 됨. 이는 OCP 를 위반함. 추상화된 객체에 의존하게 하고 구현체를 외부에서 주입해주면 사용하는 코드의 변경이 필요 없게 됨. 이를 의존성 주입(DI) 라고 함. Spring 에서의 DI 스프링에서는 구현체를 주입해주는 외부가 IOC 컨테이너임. 먼저 빈을 등록하고, 각 빈에 필요한 의존성을 주입해준다. 개발자는 빈에 해당하는 객체들을 작성하고, 그 빈에 필요한 의존성은 Spring 에서 주입해주고 호출하기에 이를 제어의 역전(IOC) 라고 함.
빈 스코프에 따른 생명 주기
singleton 디폴트 스코프로 컨테이너의 시작부터 끝까지 함께하는 빈이다. 컨테이너 생성-빈 생성-의존관계 주입-초기화 후 콜백-사용-소멸 전 콜백-종료 의 생명주기를 가진다. prototype 요청 시마다 새로운 빈을 생성하여 클라이언트에 반환한다. 스프링 컨테이너에서 빈 생성 후 의존관계 주입까지만 관리하고 그 이후 관리의 책임은 클라이언트가 갖는다. 컨테이너 생성-빈 생성-의존관계 주입-초기화 후 콜백까지만 스프링이 관리함. request http 요청마다 생성되어 http 요청과 같은 생명주기를 가짐 request 빈은 실제 http 요청이 올때까지는 존재하지 않는 빈이다. 스프링 컨테이너 생성 시점에는 request 빈이 존재하지 않기에 DI를 해주면 오류가 발생한다. 스프링에서는 Provi..