- JPA에서 Repository는 보통 MyBatis에서 Dao로 불리는 DB Layer 접근자이다.
- JPA에서 Repository라고 부르며 인터페이스로 생성한다. 단순히 인터페이스 생성 후, JpaRepository<Entity 클래스, PK 타입> 상속하면 기본적인 CRUD 메소드가 자동으로 생성된다.
- @Repository 추가할 필요도 X
- Entity 클래스와 기본 Entity Repository는 함께 위치해야 한다. Entity 클래스는 기본 Repository 없이는 제대로 역할을 못 함
- 플젝 규모가 커져 도메인 별로 분리해야 한다면 Entity 클래스 & 기본 Repository는 도메인 패키지 안에서 함께 관리
- Web Layer
- 컨트롤러 등의 뷰 템플릿 영역
- 외부 요청과 응답에 대한 전반적인 영역
- Service Layer
- @Service 에 사용되는 서비스 영역
- 일반적으로 Controller와 Dao의 중간 영역에서 사용
- @Transactional 이 사용되는 영역
- Repository Layer
- Database와 같이 데이터 저장소에 접근하는 영역
- 기존의 Dao 영역
- Dtos
- 계층 간 데이터 교환을 위한 객체들의 영역
- ex : 뷰 템플릿 엔진에서 사용될 객체나 Repository Layer에서 결과로 넘겨준 객체 등
- Domain Model
- @Entity 가 사용된 영역
- 비지니스 처리를 담당해야 할 곳
- ex : 택시 앱이라고 하면 배차, 탑승, 요금 등이 모두 도메인이 될 수 있음
- 무조건 database의 테이블과 관계가 있어야 하는 것은 아님. VO처럼 값 객체들도 이 영역에 해당
Service에서 비지니스 로직 처리하는 것 아님❗️
Service는 트랜잭션, 도메인 간 순서 보장의 역할만 할 뿐.
비지니스 처리는 Domain에서 담당.
Entity 클래스를 Request/Response 클래스로 사용해서는 안 됨.
Entity 클래스는 database와 맞닿은 핵심 클래스❗️
Dto 클래스를 사용해야 함. Request와 Response용 Dto는 View를 위한 클래스라 자주 변경이 필요함.
꼭 Entity 클래스와 Controller에서 쓸 Dto는 분리해서 사용해야 함.
View Resolver : URL 요청의 결과를 전달할 타입과 값을 지정하는 관리자 격
스프링 부트에서는 properties의 이름을 application-xxx.properties로 만들면 xxx라는 이름의 profile이 생성
→ profile=xxx 로 호출하면 해당 properties의 설정들을 가져올 수 있음
-
User 클래스 생성
-
각 사용자 권한을 관리할 Enum 클래스인 Role을 생성
→ Spring Security에서는 권한 코드에 항상 ROLE_이 앞에 있어야만 함 -
User의 CRUD를 책임질 UserRepository도 생성
-
스프링 시큐리티 설정
- build.gradle에 의존성 추가
- SecurityConfig 클래스 생성
- CustomOAuth2UserService 클래스 생성
: 구글 로그인 이후 가져온 사용자의 정보들을 기반으로 가입 및 정보 수정, 세션 저장 등의 기능 지원 - Dto인 OAuthAttributes 클래스를 생성
- Dto인 SessionUser 클래스 생성
: 세션에 사용자 정보 저장하기 위한 클래스
: User 클래스 사용하면 안됨
→ User 클래스에 직렬화를 구현하지 않았다는 에러가 뜸
→ User 클래스가 엔티티이기 때문에 언제 다른 엔티티와 관계가 형성될지 모름
→ 자식 엔티티를 갖고 있다면 직렬화 대상에 자식들까지 포함되어 성능 이슈, 부수 효과가 발생
→ 그래서 직렬화 기능을 가진 Session Dto를 추가로 만드는 것
-
어노테이션 기반으로 개선
httpSession.getAttribute("user")로 세션값을 가져오는 부분 → 메소드 인자로 세션값을 바로 받을 수 있도록 변경
어느 컨트롤러든지 @LoginUser만 사용하면 세션 정보를 가져올 수 있게 함 -
세션 저장소로 데이터베이스 사용하기
세션이 내장 톰캣의 메모리에 저장되기 때문에 애플리케이션 실행 시 초기화됨- 톰캣 세션 사용
톰캣에 세션이 저장되므로 2대 이상의 WAS가 구동되는 환경에서는 톰캣들 간의 세션 공유를 위한 추가 설정 필요 - MySQL 같은 데이터베이스를 세션 저장소로 사용
여러 WAS 간의 공용 세션 사용할 수 있는 가장 쉬운 방법
로그인 요청마다 DB IO가 발생하여 성능상 이슈가 발생할 수 있음 → 로그인 요청 많이 없는 백오피스, 사내 시스템 용도에서 사용 - Redis, Memcached와 같은 메모리 DB를 세션 저장소로 사용
B2C 서비스에서 가장 많이 사용하는 방식
→ 두 번째 방식 선택! 설정이 간단하고 비용 절감을 위해
- 톰캣 세션 사용