GitHub 주소 : https://github.com/JHKIMS/SpringBoot_Jpa_Blog
Commit : 회원가입+비밀번호 해쉬 완료
구현하는 기능
- JPA로 테이블 생성
[model패키지 - User.java]
- 회원가입 기능
[UserController.java, joinForm.jsp, user.js, UserApiController.java, UserService.java, UserRepository.java]
- 스프링 시큐리티로 비밀번호 해쉬
[SecurityConfig.java, UserService.java]
@Getter
@Setter
@Entity // 해당(User) 클래스를 통해서 MySql에 테이블이 생성된다.
@DynamicInsert
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
// 프로젝트에 연결된 DB의 넘버링 전략을 따라간다. : 여기서는 auto_increment를 사용한다.
private int id; // auto_increment
@Column(nullable = false, length = 30)
private String username;// 아이디
@Column(nullable = false, length = 100)
private String password;
@Column(nullable = false, length = 50)
private String email;
@Enumerated(EnumType.STRING)
private RoleType role; // Enum을 사용할 것이다.
@CreationTimestamp // 시간이 자동으로 입력된다.
private Timestamp createDate;
}
@DynamicInsert : Insert 쿼리 실행시 null인 필드를 제외시킨다.
@Entity : 이 어노테이션이 있는 클래스는 MySql에 테이블을 만들어준다.
@Column : DB컬럼의 제약조건을 설정할 수 있다.
@Enumerated : 보통 ENUM클래스를 통해서 권한을 지정하는 용도로 사용한다.
@CreationTimestamp : 시간이 자동으로 입력된다.
@Id : 데이터베이스의 Primark Key와 매핑한다.
@GeneratedValue : @Id와 보통 같이 사용하는데, 위의 경우 사용하는 DB의 넘버링 전략을 따라갈 것이라고 선언했다.
메인 페이지에서 회원가입 클릭
→ 회원가입을 클릭하게 되면 a href="auth/joinForm"으로 가게 되어있다.
→ UserController의 "auth/joinForm"으로 맵핑되어있는 곳은 joinForm메소드인데,
이 메소드는 user/joinForm을 반환한다
→ 반환된 user/joinForm은 이렇게 동작한다.
→ WEB-INF/views/user/joinFrom 이렇게 동작하는 이유는 다음 그림과 같다(application.yml)
→ joinForm.jsp의 회원가입 양식을 채우고 회원가입 버튼 클릭
→ user.js(auth/joinProc) url부분에 있는 /auth/joinProc는...
→ UserApiController에 있다. userService.join() 부분에는 비밀번호를 해쉬하는 과정이 들어가기 때문에 밑에 비밀번호 해쉬에서 살펴보자.
⚙️ Spring-Security 개념이 들어가는데 기능 구현 포스팅에서는 부분적으로만 다루고,
Security에 대해서는 따로 정리를 해야할 것 같다.
우선은 비밀번호를 해쉬화를 하기 위해서는 spring-security를 사용해야 하는데,
시큐리티 설정을 하면 모든 경로가 차단되기 때문에 이 부분을 처리해줘야 한다.
config패키지를 하나 만들어서 spring-security를 설정해주자.
SecurityConfig.java
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable() // csrf토큰 비활성화 ( 테스트시 걸어두는 것이 좋다.)
.authorizeRequests()
.antMatchers("/","/auth/**","/js/**","/css/**","/image/**")
.permitAll()
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginPage("/auth/loginForm");
}
이렇게 .antMatchers부분에 경로를 넣으면 Spring-Security로그인을 하지 않고도 저 경로들로 접근이 가능하다.(이 부분 설정을 안 해주면 어디로 가든 Spring-Security로 로그인 해야 한다.)
만약 이해가 잘 안 간다면 pom.xml에 spring-security주석을 해제하고, 이 설정파일 없이 실행해보면 무슨 말인지 이해할 수 있을 것이다.
⌘ 비밀번호의 해쉬는 BCryptPasswordEncoder로 한다.
이 부분은 SecurityConfig과 비밀번호를 저장하는 로직이 일어나는 곳인 UserService 에서 사용된다.
→ 해쉬 기능을 사용하는 이유는 DB관리자도 회원의 비밀번호를 알면 안되기 때문에 비밀번호 데이터를 암호화 시켜줄 필요가 있다.
💢 ↓ 이 부분은 정확하진 않다. : JPA을 조금 더 공부하면서 개념을 잡아갈 예정이다.
이 2번째 그림이 userService.join() 부분이다.
여기 join부분을 보면 Password와 Role만 값을 넣어주고 있다.
그러면 다른 id, email 같은 거는 어떻게 저장되는 것일까?
이 UserRepository인터페이스가 JpaRepository를 상속받는데, 저기 JpaRepository 안에는 save, findAll, findAllById 등 다양한 함수들이 있다.
그러므로 userService.join함수가 정상적으로 돌아가는 것이다.
💢 ↑ 이 부분은 정확하진 않다. : JPA을 조금 더 공부하면서 개념을 잡아갈 예정이다.
→ 이런 부분은 JPA 포스팅을 하면서 조금 더 다뤄 볼 예정이다.
➽ 다음으로 포스팅할 기능은 로그인 기능인데, 우선 BLOG, KIMGRAM 거의 다 완성단계에 있다.
그런데 기능 포스팅을 한 번에 할려고 하니 헷갈리는 부분이 많다... 가급적이면 구현을 완료할 때마다 바로바로 하는 습관을 들이는 것이 좋을 것 같다.