관리 메뉴

bright jazz music

blog38 : 회원가입과 비밀번호 암호화-1 본문

Projects/blog

blog38 : 회원가입과 비밀번호 암호화-1

bright jazz music 2023. 2. 26. 14:48

지난 포스팅에서는 jwt키를 application.yml에 넣어 놓고 불러와서 jwt암호화를 진행하는 과정을 다뤘다. 이번에는 회원 가입을 다룬다. 구체적으로는 아이디와 비밀번호를 입력 받고, 비밀번호를 암호화 해서 DB에 넣는 과정이다.

 

-  application.yml 수정(data.sql 입력 되지 않도록)

현재 어플리케이션을 구동하면 data.sql이 자동으로 DB에 입력되도록 되어 있다. 빈 DB 에 테스트 할 수 있도록 application.yml에서 sql 설정을 never로 변경해준다. 사실 이 과정은 오늘 진행할 내용과 관련 없다.

 

이제 기본적인 회원가입 기능을 만든다.

 

1. AuthController.java에 회원가입 메서드 생성하기

//AuthController.java
    //회원가입
    @PostMapping("/auth/signup")
    public void signup(@RequestBody Signup signup) {
        authService.signup(signup); //사실 이렇게 바로 넘기는 것보다 레이어별로 dto를 변환해 주는 것이 좋다.
    }
}

 

2. AuthService.java에 signup() 생성하기

//AuthService.java
    //회원가입
    public void signup(Signup signup) {

        //엔티티로 변환
        var user = User.builder()
                .name(signup.getName())
                .password(signup.getPassword())
                .email(signup.getEmail())
                .build();

        userRepository.save(user);
    }
}

 

3. test하기 (AuthServiceTest.java 생성)

//AuthServiceTest.java

package com.endofma.blog.service;

import com.endofma.blog.domain.User;
import com.endofma.blog.repository.UserRepository;
import com.endofma.blog.request.Signup;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class AuthServiceTest {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private AuthService authService;

    @AfterEach
    void clean() { userRepository.deleteAll();}

    @Test
    @DisplayName("회원가입")
    void test1(){
        //given
        Signup signup = Signup.builder()
                .email("catnails@gmail.com")
                .password("1234")
                .name("catnails")
                .build();

        //when
        authService.signup(signup);

        //then
        Assertions.assertEquals(1, userRepository.count());

        User user = userRepository.findAll().iterator().next();
        Assertions.assertEquals("catnails@gmail.com", user.getEmail());
        Assertions.assertEquals("1234", user.getPassword());
        Assertions.assertEquals("catnails", user.getName());
    }

}

성공

 

4. email 중복체크 로직 만들어주기

  //AuthService.java
    //회원가입
    public void signup(Signup signup) {

        //email 중복체크
        Optional<User> userOptional = userRepository.findByEmail(signup.getEmail());
        if(userOptional.isPresent()) {
            throw new AlreadyExistsEmailException();
        }

        //엔티티로 변환
        var user = User.builder()
                .name(signup.getName())
                .password(signup.getPassword())
                .email(signup.getEmail())
                .build();

        userRepository.save(user);
    }
}

 

//UserRepository.java

package com.endofma.blog.repository;

import com.endofma.blog.domain.User;
import org.springframework.data.repository.CrudRepository;

import java.util.Optional;

public interface UserRepository extends CrudRepository<User, Long> {
    Optional<User> findByEmailAndPassword(String email, String password);

    //회원가입시 email 중복 체크
    Optional<User> findByEmail(String email);

}

 

//AlreadyExistsEmailException.java

package com.endofma.blog.exception;

public class AlreadyExistsEmailException extends BlogException{

    private static final String MESSAGE = "이미 가입된 이메일입니다.";

    public AlreadyExistsEmailException() {
        super(MESSAGE);
    }
    @Override
    public int getStatusCode() {
        return 400;
    }
}

 

//AuthServiceTest.java
@Test
    @DisplayName("회원가입 시 중복된 이메일")
    void test2(){
        //given
        User user = User.builder()
                .name("catnails")
                .email("catnails@gmail.com")
                .password("1234")
                .build();
        userRepository.save(user);

        Signup signup = Signup.builder()
                .email("catnails@gmail.com")
                .password("1234")
                .name("catnails")
                .build();

        //when
        authService.signup(signup);

        //then
        Assertions.assertEquals(1, userRepository.count());


    }
}

//AuthServiceTest.java
    @Test
    @DisplayName("회원가입 시 중복된 이메일")
    void test2(){
        //given
        User user = User.builder()
                .name("catnails")
                .email("catnails@gmail.com")
                .password("1234")
                .build();
        userRepository.save(user);

        Signup signup = Signup.builder()
                .email("catnails@gmail.com")
                .password("1234")
                .name("catnails")
                .build();

        //expected
        Assertions.assertThrows(AlreadyExistsEmailException.class, () -> authService.signup(signup));
        
    }
}

 

5. AuthController.signin()에 대한 테스트 코드 작성

//AuthController.java
    @Test
    @DisplayName("회원가입")
    void test6() throws Exception {
        //given
        Signup signup = Signup.builder()
                .name("catnails")
                .password("1234")
                .email("catnails@gmail.com")
                .build();

        //expected
        mockMvc.perform(post("/auth/signup")
                .content(objectMapper.writeValueAsString(signup)) //signup을 json으로 변환
                .contentType(APPLICATION_JSON))
                .andExpect(status().isOk())
                .andDo(print());

    }
}

Comments