책 📚
이동욱 - 스프링 부트와 AWS로 혼자 구현하는 웹 서비스
lombok
- 롬복은 코드를 단순화시켜줄 뿐, 필수 어노테이션은 아니다.
- @Entity가 주요 어노테이션임
-> 해당 어노테이션이 선언된 클래스에는 Setter 메소드를 만들지 않는다.
ex) @Getter , @NoArgsConstructor
@Entity
@Id
- 해당 테이블의 PK(PrimaryKey)필드 나타냄
@GeneratedValue
- PK의 생성 규칙을 나타냄
- GenerationType.IDENTITY 옵션 추가 시, auto_increment됨
@Column
- 테이블의 칼럼을 나타내며, 굳이 선언하지 않아도 해당 클래스의 필드는 모두 칼럼
- 기본값 이외에 추가로 변경이 필요한 옵션이 있으면 사용함
@NoArgsConstructor
@Getter
- 클래스 내 모든 필드의 Getter 메소드 자동 생성
@Builder
- 해당 클래스의 빌더 패턴 클래스 생성
- 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함
Setter가 없는 상황에서 DB에 삽입해야 할 때
- @Builder어노테이션을 통해 제공되는 빌더 클래스를 사용한다.
JpaRepository<Entity 클래스, PK타입> 상속 시 기본적인 CRDU 메소드 자동으로 생성됨
@Repository를 추가할 필요도 없음
-> 주의 Entity클래스와 기본 Entity Repository는 함께 위치해야 함
Entity클래스는 기본 Repository없이 제대로 역할 할 수 없음
@After
- Junit에서 단위테스트가 끝날 때마다 수행되는 메소드 지정
- 배포 전 전체 테스트를 수행할 때 테스트간 데이터 침범을 막기 위해 사용
@postsRepository.save
- 테이블 posts에 insert/update 쿼리를 실행
- id 값이 있다면, update가 실행되고 / 없다면 insert 쿼리가 실행됨
@postsRepository.findAll
- 테이블 posts에 있는 모든 데이터를 조회해오는 메소드
=====================
@Autowired vs setter vs 생성자
생성자로 Bean 주입받는 것을 가장 권장! => @RequiredArgsConstructor
@RequiredArgsConstructor
- final이 선언된 모든 필드를 인자값으로 하는 생성자를 대신 생성해주는 어노테이션
@MappedSuperclass
- JPA Entity 클래스들이 BaseTimeEntity을 상속할 경우 필드들도 칼럼으로 인식하도록 함
@EntityListeners(AuditingEntityListener.class)
- BaseTimeEntity 클래스에 Auditing 기능을 포함시킴
@CreatedDate
- Entity가 생성되어 저장될 때 시간이 자동 저장됨
@LastModifiedDate
- 조회한 Entity의 값을 변경할 때 시간이 자동 저장됨
@Transactional
readOnly = true
: 트랜잭션 범위는 유지하되, 조회 기능만 남겨두어 조회 속도가 개선됨
-> 등록,수정,삭제 기능이 전혀 없는 서비스 메소드에서 사용하는 것 추천
구글 로그인 연동 관련 annotation
@Enumerate(EnumType.STRING)
- JPA로 데이터베이스로 저장할 때 Enum 값을 어떤 형태로 저장할 지 결정
- 기본적으로 int로 된 숫자가 저장됨
- 숫자로 저장 시, DB로 확인할 때 그 값이 무슨 코드를 의미하는 지 알 수 없음
= 문자열(EnumTtpe.STRING)로 저장될 수 있도록 선언
@EnabledWebSecurity
- SpringSecurity 설정들을 활성화시켜줌
@csrf().disble().headers().frameOptions().disable()
- h2-console 화면을 사용하기 위해 해당 옵션들을 disable 한다.
authorizeRequests
- URL별 권한 관리를 설정하기 위한 옵션의 시작점
- authorizeRequests가 선언되어야만 antMatchers 옵션 사용 가능
antMatchers
- 권한 관리 대상을 지정하는 옵션
- URL,HTTP 메소드 별로 관리 가능
- "/" 등 지정된 URL들을 permitAll()옵션 통해 전체 열람 권한 부여
- "/api/v1/**"주소 가진 API는 USER권한 가진 사람만 가능하도록
anyRequest
- 설정된 값들을 이외 나머지 URL들 나타냄
- authenticated()를 추가하여 나머지 URL들은 모두 인증된 사용자드에게만 허용하게 함
- 인증된 사용자 = 로그인한 사용자
logout().logoutSuccessUrl("/")
- 로그아웃 기능에 대한 여러 설정의 진입점
- 로그아웃 성공 시 / 주소로 이동
oauth2Login
- OAuth2로그인 기능에 대한 여러 설정의 진입점
userInfoEndpoint
- OAuth2로그인 성공 이후 사용자 정보 가져올 때 설정 담당
userService
- 소셜 로그인 성공 시 후속 조치를 진행할 UserService 인터페이스의 구현체 등록
- 리로스 서버(소셜서비스들)에서 사용자 정보를 가져온 상태에서 추가로 진행하고자 하는 기능 명시 가능
registrationId
- 현재 로그인 진행 중인 서비스를 구분하는 코드
- 하나의 소셜 로그인인 경우 불필요하지만, 구글/네이버 연동 시 구분하기 위해 사용
userNameAttributeName
- OAuth2 로그인 진행 시 키가 되는 필드 값 야기( PK 같은 의미)
- 구글 "sub"로 기본 키 지원(네이버/카카오 X)
- 네이버-구글 로그인 동시 지원 시 사용
OAuthAttributes
- OAuth2UserService를 통해 가져온 OAuth2User의 attribute를 담을 클래스
- 다른 소셜 로그인도 해당 클래스 사용
SessionUser
- 세션에 사용자 정보를 저장하기 위한 Dto 클래스
of()
- OAuth2User에서 반환하는 사용자 정보는 Map이기 떄문에 값 하나하나를 변환해야만 함
toEntity()
- User 엔티티 생성
- OAuthAttributes에서 엔티티 생성하는 시점은 처음 가입할 때
- 가입할 때의 기본 권한을 GUEST로 주기 위해서 role 빌더 값에는 Role.GUEST를 사용함
- OAuthAttributes 클래스 생성 끝나면, 같은 패키지에 SessionUser 클래스 생성
@Target(ElementType.PARAMETER)
- 어노테이션이 생성될 수 있는 위치 지정함
- PARAMETER로 지정했으니 메소드의 파라미터로 선언된 객체에서만 사용할 수 있음
- 클래스 선언문에 쓸 수 있는 TYPE 등이 있음
@interface
- 해당 파일을 어노테이션 클래스 지정
- LoginUser라는 이름을 가진 어노테이션이 생성됨
supportsParameter()
- 컨트롤러 메서드의 특정 파라미터를 지원하는 지 판단
- [In code]파라미터에 @LoginUser 어노테이션이 붙어 있고, 파라미터 클래스 타입이 SessionUser.class인 경우 true 반환
resolveArgument()
- 파라미터에 전달할 객체를 생성
- [In code] 세션에서 객체를 가져온다.