고3인 동생이 겨울방학때 술마시고 싶다는데 웃겨 죽겠다~^^ ^^
Dto와 Controller, Service, Repository으로 구성된 간단한 회원가입을 구현해보자.
package com.jwt.jwtstudy_youtube.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class JoinDto {
private String username;
private String password;
}
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";
}
}
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);
}
}
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년이 되면 뿌듯한 개발자가 되었으면 좋겠다... 🙏