
➡️ Role값으로 USER, ADMIN 2개를 입력
➡️ 가입 정보를 담은 dto 생성
➡️ 회원 정보 저장하는 Member 엔티티 생성
➡️ 1) 이메일로 구분하기에 unique 속성 지정
➡️ 2) 자바의 enum 타입을 엔티티의 속성으로 지정할 수 있음. Enum을 사용할 때 기본적으로 순서가 저장되는데, enum의 순서가 바뀔 경우 문제가 발생할 수 있으므로 "EnumType.STRING" 옵션을 사용해서 String으로 저장 권장
➡️ 3) Member 엔티티를 생성하는 메소드. Member 엔티티에 회원을 생성하는 메소드를 만들어서 관리를 한다면 코드가 변경되더라도 한 군데만 수정하면 되는 이점이 있음.
➡️ 4) 스프링 시큐리티 설정 클래스에 등록한 BCryptPasswordEncoder Bean을 파라미터로 넘겨서 비밀번호를 암호화
➡️ Member 엔티티를 데이터베이스에 저장할 수 있도록 MemberRepository를 만듦
➡️ 1) 회원가입 시 중복된 회원이 있는지 검사하기 위해서 이메일로 회원을 검사할 수 있도록 쿼리 메소드를 작성
(✔️ 괄호 하나 지우기)
➡️ 1) 비즈니스 로직을 담당하는 서비스 계층 클래스에 @Transactional 선언. 로직을 처리하다가 에러가 발생하였다면, 변경된 데이터를 로직을 수행하기 이전 상태로 콜백 시켜줌.
➡️ 2,3) 빈을 주입하는 방법으로 @Autowired 이용하거나, 필드 주입(Setter 주입), 생성자 주입을 이용하는 방법이 있음. @RequiredArgsConstructor은 final이나 @NonNull이 붙은 필드에 생성자를 생성해줌. 빈에 생성자가 1개이고 생성자의 파라미터 타입이 빈으로 등록이 가능하다면 @Autowired 없이 의존성 주입이 가능
➡️ 4) 이미 가입된 회원의 경우 IllegalStateException 예외를 발생시킴

➡️ 1) 테스트 클래스에 @Transactional 선언할 경우, 테스트 실행 후 롤백 처리가 됨. 이를 통해 같은 메소드를 반복적으로 테스트 가능
➡️ 1) Junit의 Assertions 클래스의 assertThrows 메소드를 이용하면 예외 처리 테스트 가능. 첫번째 파라미터에는 발생할 예외 타입을 넣어줌.
➡️ 회원 가입 페이지로 이동할 수 있도록 MemberController 클래스에 메소드 작성
➡️ 1) 회원가입 시 실패했다면 에러 메시지를 경고창으로 보여줌
➡️ 2) 스프링 시큐리티를 사용할 경우 기본적으로 CSRF(Cross Site Request Forgery)를 방어하기 위해 모든 POST 방식의 데이터 전송에는 CSRF 토근 값이 있어야 함. CSRF 토큰은 실제 서버에서 허용한 요청이 맞는지 확인하기 위한 토큰. 사용자의 세션에 임의의 값을 저장하여 요청마다 그 값을 포함하여 전송하면 서버에서 세션에 저장된 값과 요청이 온 값이 일치하는지 확인하여 CSRF를 방어함.
✏️ CSRF
CSRF(Cross Site Request Forgery)란 사이트간 위조 요청으로 사용자가 자신의 의지와 상관없이 해커와 의도한대로 수정, 등록, 삭제 등의 행위를 웹사이트 요청하게 하는 공격을 말함

➡️ 회원가입 후 메인페이지로 갈 수 있도록 메인컨트롤러 생성




<!-- 회원가입 처리를 위한 의존성 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>