@Service
public class JoinService {
private final UserRepository userRepository;
private final BCryptPasswordEncoder bCryptPasswordEncoder;
public JoinService(UserRepository userRepository, BCryptPasswordEncoder bCryptPasswordEncoder) {
this.userRepository = userRepository;
this.bCryptPasswordEncoder = bCryptPasswordEncoder;
}
public void joinProcess(JoinDto joinDto) {
String username = joinDto.getUsername();
if (userRepository.existsAllByUsername(username)) {
//존재하는 경우
return;
}
UserEntity user = new UserEntity();
String password = user.getPassword();
user.setUsername(username);
user.setPassword(bCryptPasswordEncoder.encode(password));
user.setRole("ROLE_ADMIN");
System.out.println("user = " + user);
userRepository.save(user);
위는 내가 짠 코드다.
내 눈에는 크게 문제가 있어보이지도 않고
user
set부분이 길다는 거 빼고는 괜찮다고 생각했다.
그러나 위의 코드는 두가지의 문제를 가진다.
그러나 명확하지 않은 이름 때문에 password를 가져오는 부분에서 오류가 났다.
파라미터로 받은 joinDto
에서 passWord
를 가져왔기 때문이다.
또한 joinDto
에서 값을 가져오는 지점이 UserEntity
선언부와 값 설정 부분에 위치해 불명확하다.
if
문 뒤에 선언한 이유는 Password
변수 사용이 확실한 시점에 선언해, 메모리를 절약하고 싶었다.
그러나 이런 전형적이지않은..위치의 코드로 오는 예상치 못한 오류, 낮은 코드의 가독성을 생각하면 메모리를 더 쓰는게 훨씬 났다는 결론을 냈다. (또한 이정도의 메모리는 무시해도 될 정도...?)
또한 이런 코드의 가장 큰 문제점은 시간이 지나서 보거나, 타인이 코드를 읽을 때 당연히 값을 설정하는 내용일거라고 짐작하게 될 것이라는거다...ㅜㅜ
코드는 나만 쓰는 것이 아니라, 미래의 나와 타인이 함께 쓰는 것이므로 이해하기 좋은 코드를 항상 생각하자는 결론을 냈다.
결국 내 문제점은 명확하지 않은 변수명과, joinDto에서 값을 꺼내오는 지점이 적절하지 않다는 것이다.
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);
}
}