[스프링 시큐리티 JWT] 회원가입을 하자.

코린이서현이·2024년 6월 18일
0
post-thumbnail

들어가면서

고3인 동생이 겨울방학때 술마시고 싶다는데 웃겨 죽겠다~^^ ^^

Dto와 Controller, Service, Repository으로 구성된 간단한 회원가입을 구현해보자.

회원가입

Dto

package com.jwt.jwtstudy_youtube.dto;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class JoinDto {
    private String username;
    private String password;
}

Controller

package com.jwt.jwtstudy_youtube.controller;

import com.jwt.jwtstudy_youtube.dto.JoinDto;
import com.jwt.jwtstudy_youtube.service.JoinService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody //API응답을 위해서
public class JoinController {

    private final JoinService joinService;

    public JoinController(JoinService joinService) {
        this.joinService = joinService;
    }

    @PostMapping("/join")
    public String joinProcess(JoinDto joinDto) {
        joinService.joinProcess(joinDto);
        return "ok";
    }
}

Service

package com.jwt.jwtstudy_youtube.service;

import com.jwt.jwtstudy_youtube.dto.JoinDto;
import com.jwt.jwtstudy_youtube.entity.UserEntity;
import com.jwt.jwtstudy_youtube.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class JoinService {

    private final UserRepository userRepository;
    private final BCryptPasswordEncoder bCryptPasswordEncoder;

    public JoinService(UserRepository userRepository, BCryptPasswordEncoder bCryptPasswordEncoder) {
        this.userRepository = userRepository;
        this.bCryptPasswordEncoder = bCryptPasswordEncoder;
    }

    @Transactional
    public void joinProcess(JoinDto joinDto) {
        String username = joinDto.getUsername();
        String rowPassword = joinDto.getPassword();

        if (userRepository.existsByUsername(username)) {
            //존재하는 경우
            return;
        }

        UserEntity user = new UserEntity();

        user.setUsername(username);
        user.setPassword(bCryptPasswordEncoder.encode(rowPassword));
        user.setRole("ROLE_ADMIN");

        userRepository.save(user);

    }
}

Repository

package com.jwt.jwtstudy_youtube.repository;

import com.jwt.jwtstudy_youtube.entity.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<UserEntity, Integer> {

    Boolean existsByUsername(String username);
}

Dto를 쓰면서 느낀 점

확실히 Dto를 쓰는게 안전하고 UserEntity의 무결성을 유지할 수 있을 것 같다.

유저에게 회원가입을 받는 데이터와 DB에 올라가는 Entity와는 차이가 있으니까!

특히 유저에게Role 데이터를 받을 수는 없는 데 이를 컨트롤러단에서 UserEntity로 받으면 그에 따라 Role이 없는 생성자를 써야하는데, 그게 내 입장에서는 달갑지가 않다... 너무 추상적인가?(ㅋㅋㅋ)

왜냐면, 실수로 Role을 넣지 않은 객체를 DB에 넣을 수 있고 null 오류가 날 수도 있기 때문이다.!!

마무리하면서

2024년이 지나고 2025년이 되면 뿌듯한 개발자가 되었으면 좋겠다... 🙏
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글