삽질 주도 개발
article thumbnail
Spring security Architecture 이해하기
Spring 2023. 1. 30. 01:12

공식 문서에서 설명하는 스프링 시큐리티 아키텍처를 보며 정리하는 글입니다. 스프링 시큐리티는 스프링 애플리케이션의 인증/인가 및 보안적 요소들을 손쉽게 관리할 수 있도록 해 주는 스프링 프로젝트 중 하나이다. 단일 요청의 서블릿 컨테이너 형식적 계층 클라이언트가 애플리케이션으로 요청을 보내면, 서블릿 컨테이너는 FilterChain을 생성하게 된다. FilterChain은 Filter 인스턴스들과 request URI 경로를 기반으로 한 HttpServletRequest를 처리하기 위한 Servlet을 포함한다. Spring application의 Servlet은 DispatcherServlet이 실구현체가 된다. 코드를 통해 확인해보자. 위에서 FilterChain에서는 filters과 servlet을..

article thumbnail
Spring 프로필 환경별 빈 주입하기
Spring 2023. 1. 20. 02:02

오늘은 @Profile을 활용해서 환경별로 빈 주입을 다르게 하는 방법을 알아보도록 한다. 사내 서비스가 사외 서비스로 one-code로 오픈이 되는 경우가 있다. 그렇게 되면 상황별로 처리해야 하는 로직이 틀려질 수 있다. 이때 분기문으로 매번 처리를 하게 되면 코드가 지저분해질 뿐더러 테스트가 어려워지는 코드가 된다. 즉, 환경별로 담당하는 서로 다른 객체에 역할을 분리해주는 것이 더 나은 방법이다. 이때 다형성과 @Profile을 활용하면 보다 나은 방법으로 환경별 로직을 처리할 수 있다. 먼저 @Profile을 사용하지 않는 상황을 생각해보자. profile은 internal과 external이 있다고 가정한다. signIn()은 환경별로 로직이 달라지고, sendOtp()는 공통 로직으로 처리된..

article thumbnail
Spring boot 자동 설정 메커니즘
Spring 2022. 12. 1. 14:06

Spring boot로 인해서 기존의 스프링을 사용하기 위한 초기 설정을 생략해도 됩니다. 그렇다면! 이번 시간은 Spring boot의 자동 설정(AutoConfiguration) 메커니즘을 알아보도록 하겠습니다. 먼저 @SpringBootApplication을 한 번 살펴보겠습니다. Boot의 특성에 맞게 @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan이 자동 설정에 사용되는 핵심 어노테이션처럼 보이네요. @ComponentScan Spring boot는 xml 기반의 설정 대신 어노테이션 기반의 설정을 위해 해당 어노테이션을 사용합니다. scanBasePackages 기준 패키지를 지정해서 스캔할 패키지를 설정합니다. 패키지 경..

article thumbnail
주관적인 생각이 그득한 detach, remove
Spring 2022. 11. 22. 20:44

JPA를 사용하다가 준영속 상태인 detach와 엔티티를 제거하는 remove의 실제 동작을 확인해보며 엔티티 매니저의 관리 범위 그리고 1차 캐시의 상태를 예상해보려고 합니다. 준영속 상태 영속성 컨텍스트에 의해 관리되다가 detach, 떨어져 버린 상태를 의미합니다. 즉, 트랜잭션 내에서 영속성 컨텍스트가 엔티티의 영속성을 관리해주는데, 더 이상 관리하지 않게 됩니다. 그렇다면 JPA의 1차 캐시, 쓰기 지연 SQL 저장소를 사용할 수 없게 되는데요. 특히, 쓰기 지연 SQL 저장소를 사용하지 못하게 되면 commit()을 하더라도 쓰기 지연 저장소에서 관리되지 않으니 엔티티에 대해 flush가 되지 않습니다. Member member = new Member(); member.setUsername("..

article thumbnail
Jasypt로 properties 암호화
Spring 2022. 11. 20. 03:50

Spring을 사용하면 많은 리소스를 관리하게 되는데, url, password, username 등의 데이터들은 노출이 되면 안된다. 그렇기 때문에 암호화를 해줘야 하는데, Jasypt라는 프로퍼티를 암호화해서 관리할 수 있다. 의존성 추가 com.github.ulisesbocchio jasypt-spring-boot-starter 3.0.4 암호화 프로퍼티 활성화 빈 주입 @Configuration public class JasyptConfigure { @Value("${jasypt.encryptor.password}") private String key; @Bean("jasyptStringEncryptor") public StringEncryptor stringEncryptor() { SimpleS..

article thumbnail
JPA 연관 관계 매핑 기초
Spring 2022. 11. 20. 00:25

테이블에 맞추어 모델링 team table과 member table이 1:N 관계를 맺고 있다고 가정하자. 그렇다면 기본적으로 테이블의 ERD는 다음과 같다. 그렇다면 테이블에 맞춰 객체를 모델링해보면 다음과 같이 설계될 수 있다. @Entity public class Team { @Id @GeneratedValue @Column(name = "team_id") private Long id; private String name; public Team() {} // getter/setter } @Entity public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; ..

article thumbnail
spring boot 2.5 이후 DB 데이터 초기화 설정 변경 사항
Spring 2022. 11. 19. 15:15

보통 schema.sql, data.sql을 구성하거나, import.sql로 데이터를 초기화하는 방법이 있는데, 오늘은 spring boot 2.5부터 변경된 DB 데이터 초기화 설정으로 schema.sql과 data.sql을 다뤄보고자 한다. Spring boot 2.5 이전 spring: datasource: driver-class-name: org.h2.Driver url: jdbc:h2:~/test username: sa password: initialization-mode: always schema: classpath:schema.sql data: classpath:data.sql spring boot 2.5 이전에는 spring.datasoruce 프로퍼티에서 해당 데이터를 초기화하는 방법을..

article thumbnail
JPA flush
Spring 2022. 11. 19. 01:30

JPA(Java Persistence Api)에서 영속성 컨텍스트와 실제 DB 간의 동기화하기 위한 flush에 대해 이해해보자. flush 영속성 컨텍스트의 변경 내용을 DB에 반영하는 것을 말한다. 일반적으로 transaction.commit()을 호출하게 되면 내부적으로 flush()를 호출하게 된다. flush라는 이름이 느낌이 뭔가 다 비우는 것 같지만, 1차 캐시는 비워지지 않는다 그 외에 영속성 컨텍스트를 바로 플러시하는 방법은 다음과 같다. em.flush() Member member = new Member("silly"); em.persist(member); em.flush(); // 쿼리가 실행되어 DB에 반영 transaction.commit(); // commit jpql 쿼리 실행..

article thumbnail
엔티티 매핑
Spring 2022. 11. 18. 02:09

JPA가 객체와 테이블을 매핑하기 위해서 지원하는 매핑 어노테이션을 이해해보자. JPA가 관리하는 테이블로 지정하는 방법 @Entity는 JPA에게 테이블 매핑을 위한 객체임을 알리기 위한 어노테이션이다. @Entity가 붙은 클래스는 JPA가 관리한다. 기본 생성자 필수 final class, enum, inner class로는 사용 불가 당연하게도 필드가 final이면 안된다. 기본키 매핑 방법 Entity로 지정하게 되면 기본 키를 지정해야 한다. 기본 키로 사용하기 위한 필드에 @Id를 붙이면 된다. 기본 키 자동 생성 전략 sequence 혹은 auto_increment와 같은 조건처럼 JPA에서도 자동 생성 전략을 지원한다. 기본 어노테이션은 @GeneratedValue를 붙이면 된다. 생성 ..

article thumbnail
영속성 컨텍스트
Spring 2022. 11. 18. 01:52

JPA(Java Persistence Api)를 배우면서 가장 핵심적인 개념인 영속성 컨텍스트에 대해서 간단히 이해해보자. 영속성 컨텍스트 말 그대로 엔티티를 영구 저장하는 환경 Entity lifecycle 비영속(new/transient) 영속 (managed) 준영속 (detached) 삭제 (removed) EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction transaction = em.getTransaction(); transaction.begin(); try { Member member = new..