Spring 57

[Spring] Spring 3.0.0 AutoConfigure 사용

문제 발단 스프링을 활용한 오픈 소스 라이브러리 "ReflectiveCipher"를 개발 중 자동 빈 생성과 application.yml 자동 완성을 지원하기 위해 AutoConfigure를 설정 중 문제가 발생했다. 위와 같은 프로젝트 구조로 이루어져 있는 데, auto-configure 모듈이 Spring 라이브러리를 사용하여 자동 빈 생성을 해준다. 스프링에서 편하게 제공해준다고 하여, baeldung과 여러 블로그 글들을 참고하여 resources/META-INF 디렉토리를 생성. 그리고 그 안에 spring.factories를 추가하면 손쉽게 AutoConfigure가 된다고 하여 적용을 해보았지만, example 모듈(스프링 환경)에서 특정 빈을 조회하도록 하였지만, 해당 빈이 존재하지 않는다..

Spring 2023.03.13

[Spring/공부] Custom Interceptor

토이 프로젝트를 진행하다 Spring Security 없이 토큰을 통한 인가를 해야 했다. 이때, 음악(Music)과 회원(User)이라는 엔티티가 다대일(양방향)이고, 회원에서 굳이 음악을 가져올 일이 없는 경우가 종종 있어 지연로딩으로 가져오려 하는 도중 LazyInitializationException 이 발생하여 이에 대해 기록하고자 한다. Interceptor란? Spring MVC에서 요청이 컨트롤러로 위임되기 전, 위임된 후, 뷰 처리 단계에서 특정 로직을 할 수 있는 스프링에서 제공하는 장치 쉽게 설명하자면, "요청에 대한 작업 전/후로 가로채어 특정 로직을 수행하는 역할" 정도로 설명할 수 있다. HandlerInterceptor 인터페이스를 직접 구현하여, 인터셉터를 직접 구현할 수 있..

Spring/공부 2023.03.08

[괴발개발] 덕지덕지 개발記 (#2)

본격적으로 데이터베이스 설계를 해보고자 한다. 엔티티는 크게 유저(member)와 메모지(memo)로 2개이다. 하지만, 현재 S3와 같이 외부 스토리지가 따로 준비가 되어있지 않은 관계로 유저의 배경화면을 따로 저장을 할 수 없다. 그렇기에 이를 데이터베이스에 따로 저장하여 사용할 계획이다. (배경 엔티티가 추가로 생긴다.) 위와 같이 ERD(엔티티 관계 다이어어그램)으로 표현할 수 있다. 물론 JPA 를 사용하는 경우, Join Table 이나 프록시 등으로 브릿지 테이블은 개발자가 직접 구현하지 않아도 된다. (실수로 전부 비식별키로 해버렸다.) 여기서 메모지 엔티티를 보면 칼럼이 굉장히 많으며, 몇몇 칼럼들이 부분적 종속이 존재한다. (뭔가 더 깔끔하게 ERD를 작성하고 싶었지만, ERDCloud..

Spring/괴발개발 2023.02.20

[괴발개발] 덕지덕지 개발記 (#1)

기존 덕지덕지를 전부 갈아엎고 다시 개발할 예정이다. 1년전 코드를 다시 보니 너무 개판이고, 왜 사용하는 지도 제대로 알지 못한 채 그냥 막 사용했던 기억이 있어, 필자의 경험상 제대로 알지 못하고 사용한 경우에는 다시 새롭게 만드는 편이 귀찮더라도 오랫동안 기억에 남기 때문이다. 그리고 더 오랫동안 기억에 남기기 위해 데이터베이스 설계, 아키텍처 설계 등 개발을 하며 발생하는 거의 모든 내용들을 기록하고자 한다. 개발 목표 "간단한 메모만 하고 싶을 때 사용하는 원격 메모지 서비스" 개발 내용 유저 기능 로그인 (Google Login, Kakao Login) 전부 OAuth 유저 기본 정보 수정 메모지 작성 (수정, 삭제 포함) 배경 화면 변경 로그아웃, 회원 탙퇴 메모지 기능 메모지 색 변경 글씨..

Spring/괴발개발 2023.02.19

[Spring/JPA] JPA Auditing

JPA Auditing INSERT, UPDATE, DELETE 의 SQL 를 추적하여, 영속 상태인 엔티티의 엔티티 버전 관리와 관련된 이벤트들을 추적 및 로깅하는 기능이다. 순수 JPA 에는 Auditing (추적)할 수 없다. (javax(현재는 jakarta)에 직접적으로 명시되어있지 않다.) 하지만 엔티티 라이프 사이클을 사용하여 구현할 수 있다. (엔티티 라이프 사이클은 다음 포스트에서 자세히 다루겠다.) @PrePersist, @PreUpdate, @PreRemove @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Member { @Id @Gene..

Spring/JPA 2023.02.17

[Spring/JPA] 엔티티의 생명주기

엔티티 상태 JPA Entity 에는 다음과 같은 4가지 종류의 상태가 존재한다. 비영속 (new/transient) 영속성 컨텍스트와 전혀 관게가 없는 상태 영속 (managed) 영속성 컨텍스트에 저장된 상태 (관리되는 상태) 준영속 (detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 (removed) 삭제된 상태 생명주기는 다음 그림과 같다. 비영속 순수한 객체 상태이며, 아직 영속성 컨텍스트에 저장되지 않은 상태이다. 영속성 컨테스트나 데이터베이스와 상관없는 상태이다. // 객체를 생성한 상태 (비영속) Member member = new Member(); member.setUsername("clover"); EntityManager#persist 를 호출하기 전 상태이다. 영속 ..

Spring/JPA 2023.02.16

[Spring/JPA] EntityGraph

EntityGraph 란? 연관관계가 있는 엔티티를 조회할 경우, 지연로딩으로 설정되어 있다면 연관관계에서 종속된 엔티티는 쿼리 실행 시, select 쿼리 대신 proxy 객체를 만들어 엔티티가 적용시킨다. 그 후, 해당 proxy 객체가 호출될 때마다 select 쿼리가 전송된다. @EntityGraph 는 연관관계가 지연로딩으로 되어있을 때 fetch 조인을 사용하여 여러 번의 쿼리를 한 번에 해결할 수 있는 점에서 fetch-join 을 어노테이션을 통해 사용할 수 있도록 한 기능이다. (fetch-join은 일반 join 과 달리 연관 엔티티도 함께 영속 상태가 된다는 점이 있다.) 예를 들어 다음과 같은 엔티티들과 연관관계가 있다고 가정해 보자. @Entity @Getter @Builder @..

Spring/JPA 2023.02.15

[Spring/JPA] 벌크 연산(Bulk Operation)과 EntityGraph

벌크 연산에 대해 설명하기 전에 DB 에 Member 라는 테이블이 있고, 구독 가입비(subscription_fee)와 등급(rate) 라는 칼럼이 존재하며, 구독 가입비 칼럼은 월 당 발생하는 정기 구독 가입비, 등급 칼럼은 그 회원의 등급을 나타나며, 이는 구독 가입비에 영향을 미친다고 가정해 보자. (등급은 일반(COMMON), 프리미엄(PREMIUM) 둘 뿐이다.) 등급이 일반(COMMON)인 모든 Member 의 subscription_fee 를 10% 만큼 인상한다면 다음과 같은 SQL문을 짤 수 있다. UPDATE MEMBER SET SUBSCRIPTION_FEE = SUBSCRIPTION_FEE * 1.1 WHERE RATE = "COMMON"; 이제 JPA 의 관점에서 생각해 보자. 아..

Spring/JPA 2023.02.13

[Spring/JPA] JPA 연관관계

※ 해당 글은 Spring Data JPA 를 기준으로 삽질을 하여, 결과물을 도출해 내어 작성하는 글입니다. dependency 버전에 따라 결과가 다를 수 있음을 알립니다. application properties (yml)은 다음과 같이 설정한 상태로 진행 spring: jpa: show-sql: true database: mysql generate-ddl: true hibernate: ddl-auto: update naming: implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy database-platform: org.hibernate.dialect.MySQL8Dialect dataso..

Spring/JPA 2023.02.13

[Spring Security] 스프링 시큐리티란?

🍃 Spring Security란? 스프링에서 제공하는 모듈 중 하나로, 스프링을 기반으로 하는 보안 프레임워크이다. Spring Security 를 통해 자체적으로 세션 체크, 리다이렉션 등을 추상화하여, 보다 편하게 구현하도록 돕는다. Spring Security는 스프링 의존성을 없애기 위해 Filter 인터페이스를 기반으로 동작한다. 즉, 기존의 Spring MVC, 비즈니스 로직과 완벽하게 분리하여 관리 및 동작할 수 있다. 또, 개발자가 직접 만들어야할 필터들을 기본으로 제공해준다. 이렇게 제공하는 필터들을 SecurityFilterChain 이라 한다. SecurityFilterChain 들의 종류와 특징들은 아래에서 다루겠다. 🔐 인증과 인가 인증(Authentication)은 누구인지 식..

Spring/공부 2023.01.16