프로젝트 내용 정리/개인 프로젝트

[Spring boot] (에브리타임 클론코딩) + MySQL, 회원 가입 구현(2)

sun_young 2023. 7. 15. 14:51

[참고] 아래 첨부한 글을 참고하여 작성된 코드입니다!

https://inkyu-yoon.github.io/docs/Language/SpringBoot/SpringSecurityJoin

 

· Spring Security를 이용한 회원가입 구현

👩🏻‍💻 지식 창고 📚

inkyu-yoon.github.io

 

원래 (1)에서 참고한 책이 있는데 security를 작성하는 부분에서 이해가 안되는 부분이 있어서 구글링하다가 다른 블로그를 참고하여 코드를 구현하게 되었다ㅠㅠ

 

1. 의존성 추가

implementation 'org.springframework.security:spring-security-test'
implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'

 

2. security 코드 추가

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                .httpBasic().disable()
                .csrf().disable()
                .cors().and()
                .authorizeRequests()
                .antMatchers("user/register", "user/login").permitAll()
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .build();
    }

security에 securityFilterChain이 추가되었다.

 

csrf() : 정상적인 사용자가 의도치 않은 위조 요청을 보내는 것을 의미

→ disable() : rest api를 이용한 서버라면, 서버에 인증 정보를 저장하지 않기 때문에 굳이 불 필요한 csrf 코드 작성할 필요 없음

참고 >> https://velog.io/@woohobi/Spring-security-csrf%EB%9E%80

 

authorizeRequests() : 시큐리티 처리에 HttpServletRequest를 이용한다는 것을 의미

antMatchers() : 특정한 경로 지정

permitAll() : 모든 사용자가 접근 가능

참고 >> https://velog.io/@jayjay28/2019-09-04-1109-%EC%9E%91%EC%84%B1%EB%90%A8

 

3. controller 생성

package com.example.everytime.controller;

import com.example.everytime.DTO.UserDto;
import com.example.everytime.entity.User;
import com.example.everytime.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;

@RequestMapping("/user")
@Controller
@RequiredArgsConstructor
public class UserController {
    private final UserService userService;
    private final PasswordEncoder passwordEncoder;

    @ResponseStatus(HttpStatus.CREATED)
    @PostMapping("/register")
    public void userRegister(@RequestBody UserDto userDto) {
        User user = User.createUser(userDto, passwordEncoder);
        User savedUser = userService.saveUser(user);
    }
}

/user/register로 post 요청을 하면 회원가입 끝!

 

① @RequestBody에서 dto로 회원 정보를 받아온다

② dto를  User.createUser의 매개변수로 삽입하여 엔티티로 변경, 이때 비밀번호는 암호화한다

③ Serivce에 구현된 saveUser를 호출하여 매개변수로 엔티티를 삽입하고, 최종적으로 회원 정보를 db에 저장

* 이때 mysql에 삽입하는 과정에서 오류가 발생했는데 (정확한 오류가 뭐였는지 기억이 안 남...) 그건 그냥 데이터에 비해 컬럼 사이즈가 작아서 생긴 오류로,  크기를 늘려주면 된다 

 

 

4. 결과

성공!