본문 바로가기

Spring

(26)
Spring JPA @Id 복합키 설정 Spring JPA를 사용하면서 기본키가 2개 이상 컬럼으로 구성된 테이블을 Entity로 지정할 때가 있다. 예시로 아래와 같은 Work 테이블과 WorkE 엔티티 클래스가 있다고 가정했을때 @Table(name = "Work") public class WorkE { @Id @Column(name = "name") private String name; @Id @Column(name = "type") private String type; .... } 이름(name)과 구분(type) 두개의 컬럼을 기본키로 사용하고 있는 경우, 위처럼 두 필드에 모두 @Id 어노테이션을 사용하면 된다고 생각할 수 있다. 하지만 추가해야할 것이 있는데, 아래처럼 엔티티에 @IdClass 어노테이션을 추가해줘야한다. @IdC..
Maven Jar 빌드 외부 dependency 추가 Spring Webflux로 오브젝트 스토리지 솔루션 프로젝트를 만들면서 빌드 도구는 maven, 배포는 내장 netty 서버 쓸거라서 처음으로 jar로 배포하게 되었다. 한심하다고 느낀건 아직도 나는 maven을 제대로 모른다는 것이다. 시간이 될때 maven에 대해서 공부하고 정리를 해볼 필요를 느꼈다. 문제 pom.xml에 외부 jar파일을 추가해서 사용하고 있었는데 로컬에서 실행하면 잘 돌아가지만 jar로 배포해서 실행하면 NoClassDefFoundError가 발생하는 특정 경우가 있었다. 원인 pom에서 추가한 외부 jar dependency는 적용이 잘 되었지만, 빌드 후 생성된 jar 파일을 풀어서 BOOT-INF/lib를 보면 해당 외부 라이브러리가 없었기 때문에 필요한 클래스가 정의되지..
Spring Webflux Filter 적용 (Webfilter) Webflux를 사용해보면서 Interceptor를 적용해보고 싶었는데 기존 MVC 구조에서 사용하던 interceptor, 엄밀히 말하면 톰캣을 위해 사용하던 인터셉터는 사용할 수 없었다. 약간 찾아본 결과 Webfilter 사용을 많이 하는듯 보여서 적용해봤다. 적용은 매우 간단하다. Webfilter 인터페이스를 구현한 클래스를 하나 생성해서 @Component만 적용해주면 끝. 그래서 나는 Webfilter를 구현한 AclFilter라는 클래스를 생성했다. AclFilter import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org..
Spring Webflux Exception 전역 처리 (Functional Endpoints) webflux로 api 서버를 하나 개발하면서 에러 상황들을 전역으로 처리하고 싶었다. 스프링 mvc나 boot에서는 @ControllerAdvice나 @RestControllerAdvice를 사용하는데, webflux도 어노테이션 방식으로 @Controller를 사용한다면 동일하게 @ControllerAdvice를 사용할 수 있을것 같았다. 하지만 나는 request를 Functional Endpoints 방식으로 RouterFunction을 활용해 요청을 라우팅하기 때문에 다른 예제를 찾아보게 되었고, 그 과정에서 메서드를 까보진 않았지만 까보기전 추측한 생각을 정리하려 한다. 참고 : https://www.baeldung.com/spring-webflux-errors Handling Errors i..
Spring Webflux (3) - Select 이전 글에서 Insert하는 과정에 대해서 작성했다. 이번엔 CRUD중 Read인 SELECT 과정에 대해서 기록해보려고 한다. 사실 SELECT기능을 구현한지 꽤 되어서 기억이 듬성듬성이다. 이전과 마찬가지로 Board와 BoardFile 1:N 관계에서 목표는 Board를 여러개 받는 Flux를 리턴하는 api( getBoardList() )와 Board 1개와 해당 Board의 BoardFile을 여러개 리턴하는 api( getBoardOne() )를 구현하는 것이다. 1. getBoardList api 에 들어가기 전에 이슈가 하나 생겼다. 나는 MariaDB를 사용하고있고, 기존에 r2dbc 설정에서 mysql 드라이버를 사용하고 있었는데 이 드라이버에서 DatabaseClient나 R2dbcE..
Spring AOP 주의할 점 (프록시의 주의할 점) Spring에서 aop를 동작할 땐 프록시 방식으로 동작한다. 하지만 이 프록시를 사용할 때 주의할 점이 무엇인가 질문을 받았던 적이 있는데, 대답을 못했다. 그러고보니 나는 업무를 하면서 aop를 사실 잘 안쓰기도 했고, 개인적으로 사용할 때 그런걸 고려해본적이 없는데 그동안 aop를 제대로 활용하지 않아서 그런것이라고 생각된다. 그러면 질문의 답이 무엇일까? 사실 모른다. 하지만 구글링을 조금 해본 결과 스프링에서 aop를 타지 않는 케이스가 생길 수 있는데 아래와 같은 상황이다. 콘솔에 print만 하는 간단한 Service와 aop를 구현했다. PrintTestService @Service public class PrintTestService { @AopTester public void logic..
Spring AOP의 동작 원리 (1) - JDK Dynamic Proxy 이전에 AOP 사용에 대해 정리한 글이 있는데, 생각해보니 정확한 원리에 대해서 알아보지 못한거 같아 정리하려고 한다. Spring에서 AOP는 프록시 방식으로 동작한다. 크게 두가지 프록시 방식이 있는데 1. JDK Dynamic Proxy 2. CGLib 이 중 1번 jdk의 동적 프록시에 대해서 개인적으로 찾아보고 생각한 내용을 정리해본다. 프록시가 뭐시여 프록시는 대리 수행하는 놈이라고 생각한다. 사실 프록시는 다양한 곳에서 널리 쓰이는 개념인데, 그렇다면 Spring에서 프록시는 어떤 것으로 생각해야할까. 이렇다는건 아니지만 느낌을 쉽게 받기위해 프록시 유무에 따라 동작을 비교해 본다. 프록시X 프록시 O Service Proxy는 실제 Service가 아니지만 Service인척 Controll..
Spring Webflux (2) - Insert 이전 글에서 간단하게 Webflux 사용을 위한 R2DBC, Router, Handler에 대해 설정해봤다. 이번엔 CRUD중 Create인 Insert 기능을 먼저 구현하려고 한다. Insert의 목표는 게시글인 Board 추가와 첨부파일을 의미하는 BoardFile도 Insert하는 기능을 구현할 예정이다. Board와 BoardFile은 릴레이션(1:N)으로 테이블을 구성했다. 테스트 - Postman Board Class import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.co..