21.06.08 TIL BOOT+JPA - 테이블, 회원가입, 해쉬(KIMGRAM+블로그 공통)

김정훈·2021년 6월 8일
0

📌 BOOT+JPA KIMGRAM * 블로그 만들기(공통 : 회원가입, 비밀번호 해쉬)

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]

⚔️ JPA로 테이블 생성[ JPA에 대해서는 별도로 포스팅 예정 ]

@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 거의 다 완성단계에 있다.
그런데 기능 포스팅을 한 번에 할려고 하니 헷갈리는 부분이 많다... 가급적이면 구현을 완료할 때마다 바로바로 하는 습관을 들이는 것이 좋을 것 같다.

profile
WebDeveloper

0개의 댓글