분류 전체보기
인증 방식 비교(서버 기반 인증, 토큰 기반 인증)
서버 기반 인증(Session, Cookie) 서버 측에서 사용자들의 정보를 기억하기 위해 세션을 유지해야 하고, 세션을 메모리, 디스크, 데이터베이스 등을 통해 관리한다. 클라이언트로부터 요청을 받으면 클라이언트의 상태 정보를 저장하여 유지해야 하므로 Stateful한 구조를 가진다. [ 인증 방식 ] 사용자가 로그인 시 올바른 사용자임을 확인하고, 고유한 세션 ID 값을 부여해 세션 저장소에 저장하고 클라이언트에게 발급해준다. 클라이언트는 서버에서 해당 세션 ID를 받아 쿠키에 저장하고, 인증이 필요한 요청을 할 때 마다 쿠키를 HTTP 헤더에 담아 전송한다. 서버에서는 세션 ID를 받아 세션 저장소와 비교해 올바른 요청인지 확인한다. 인증이 완료되고 서버는 요청에 응답한다. [ 장점 ] 중요한 정보..
Filter, Interceptor, AOP (필터, 인터셉터, AOP)
Filter, Interceptor, AOP Filter, Interceptor, AOP 모두 무슨 행동을 하기전에 먼저 실행하거나, 실행한 후에 추가적인 행동을 할 때 사용된다. 요청의 흐름에 따라 필터, 인터셉터, AOP의 차이점에 대해 알아봅니다. 전체 흐름, 차이점 요청이 들어왔을 때 진행되는 순서는 Filter → Interceptor → AOP → Interceptor → Filter의 순으로 거치게 됩니다. Filter의 역할 Filter는 J2EE표준 스펙 기능으로, Dispatcher Servlet에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다. Web Application에 등록한다. 스프링 컨텍스트 외부에 존재하여 스프링과 ..
[Test] Spring Layer별 테스트 작성
Spring Boot 레이어별 테스트 작성 가이드 Domain JUnit, AssertJ 등 테스트 편의 도구를 이용해서 테스트한다. Repository 인메모리 DB를 사용하고, JPA 관련 설정만 불러오는 @DataJpaTest를 이용해서 Repository의 동작(저장 및 조회)에 대해 테스트한다. 저장을 위한 JPA 연관 관계가 적절히 구성되었는지, Repository 메소드가 제대로 구현되었는지 확인하는 것을 목적으로 한다. JPA 관련 어노테이션 없이 코드를 작성해서 저장에 실패하는 테스트 코드를 먼저 작성하고, JPA 규칙에 맞는 어노테이션을 추가해서 테스트 코드를 통과시킨다. 기본적으로 인메모리 DB를 사용하나 테스트에 사용할 DB를 지정할 수 있다. Service 트랜잭션을 관리하는 것이..
[Test] Spring Boot 테스트 클래스 정의 어노테이션
Test의 종류 @SpringBootTest 통합 테스트 실제 App과 동일한 환경에서 테스트 @WebMvcTest 컨트롤러 테스트 웹상에서의 요청과 응답에 대한 테스트 @DataJpaTest JPA 관련된 설정을 로드하여 테스트 기본적으로 인메모리 DB로 테스트 테스트가 끝날 때마다 자동으로 테스트에 사용한 데이터를 롤백 @RestClientTest Rest 통신의 JSON 형식이 예상대로 응답을 반환하는지 등을 테스트
[Test] JUnit5를 이용한 테스트 코드 작성
JUnit5란? JVM에서 사용하는 테스트 프레임워크 테스트 개발을 위한 API 제공 Spring Boot 2.2.X 버전에서는 기본적으로 제공 (spring-boot-starter-test) JUnit4, JUnit5의 차이점 Spring 기본 제공 여부 구성된 모듈 사용하는 어노테이션 JUnit5는 Java 8부터 이용 가능 JUnit5 주요 어노테이션 @Test 테스트 메소드임을 선언 @DisplayName 테스트 메소드의 이름 표기 @BeforeAll static으로 작성하고, 테스트 class가 실행되기 전에 실행되는 곳 @BeforeEach 각 테스트 메소드가 실행되기전 실행 @AfterEach 각 테스트 메소드가 실행된 후 실행 @AfterAll static으로 작성하고, 테스트 class가..
엔티티 매핑 2 (연관관계)
연관관계 매핑 기초 목표 🤔 객체와 테이블 연관관계의 차이를 이해 객체의 참조와 테이블의 외래 키를 매핑 객체가 지향하는 패러다임과 관계가 지향하는 패러다임의 차이를 이해하고 적절하게 매핑하는 방법을 이해한다. 용어 방향(Direction) : 단방향, 양방향 다중성(Multiplicity) : 다대일, 일대다, 일대일, 다대다 연관관계의 주인(Owner) : 객체 양방향 연관관계는 관리 주인이 필요함 연관관계가 필요한 이유 [예제 시나리오] 회원과 팀이 있다. 회원은 하나의 팀에만 소속될 수 있다. 회원과 팀은 다대일 관계이다. @Entity public class Member{ ... private Long teamId; ... } 연관관계가 없다면, 엔티티에 매번 외래키를 매핑해야 하고, 연관된 테..
엔티티 매핑 1(테이블, 컬럼, 키 매핑 전략)
엔티티 매핑 객체와 테이블 매핑 : @Entity, @Table 필드와 컬럼 매핑 : @Column 기본 키 매핑 : @Id 연관관계 매핑 : @ManyToOne, @JoinColumn 1. 객체와 테이블 매핑 @Entity @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 함 JPA를 사용해서 테이블과 매핑할 클래스 기본 생성자 필수(public 또는 protected 접근제한자) 가급적 name 속성은 따로 지정하지 않고 클래스명 그대로 사용한다. @Table 엔티티와 매핑할 테이블 지정 name 속성 : 테이블 이름 catalog : 데이터베이스 catalog 매핑 schema : 데이터베이스 schema 매핑 uniqueConstraints : DDL 생성 시에 유니크 제약 조건 생성 데이터..
영속성 관리 - 내부 동작 방식
JPA에서 가장 중요한 2가지 객체와 관계형 데이터베이스 매핑 영속성 컨텍스트 : JPA 내부 동작 방식 JPA 내부구조 영속성 컨텍스트 플러시 준영속 상태 영속성 컨텍스트란? 영속성 컨텍스트란? 1. 엔티티를 영구 저장하는 환경 2. 엔티티 매니저를 통해서 영속성 컨텍스트에 접근한다. (클라이언트의 요청 하나당 하나의 엔티티 매니저가 생성된다.) 영속화란? 엔티티 매니저의 persist()를 통해 엔티티를 DB에 저장하는 것이 아닌 영속성 컨텍스트에 저장하는 것 em.persist(entity); 엔티티의 생명주기 비영속(new/transient) : 영속성 컨텍스트와 관계가 없는 상태(객체 생성만 한 것) 영속(managed) : 영속성 컨텍스트에 관리되고 있는 상태 준영속(detached) : 영속..
JPA는 왜 사용해야 하는가?
JPA는 왜 사용해야 하는가? 관계형 데이터베이스를 이용해 SQL 중심적인 개발을 할 때 맞닿는 문제가 두 가지 있다. 하나는 객체지향 패러다임과 관계형 패러다임의 불일치와 SQL의 유지보수 문제이다. 비즈니스 서비스를 개발할 때 수십 개, 수백 개의 테이블을 관리하고, 각 테이블마다 컬럼을 관리하는 것은 쉬운 일이 아니다. 특히 개발 중 기획된 내용이 변경됨으로 기존 코드를 수정해야할 때가 빈번하게 발생하는데 이때 들어가는 비용은 무시할 수 없다. ORM은 최근에 갑자기 등장된 것이 아니라 꽤 오래 전부터 다뤄지는 영역이었고, 자바의 ORM 기술 표준인 JPA에 대해 알아보도록 한다. JPA를 사용함으로 얻는 이점 1. CRUD 코드 작성 소요시간을 대폭적으로 감소시켜 생산성 증가 2. 테이블의 변경사..