레포지토리 만들기
import org.springframework.data.jpa.repository.JpaRepository;
public interface AccountRepository extends JpaRepository<Account, Long> {
}
package shop.mtcoding.bank.domain.transaction;
import org.springframework.data.jpa.repository.JpaRepository;
public interface TransactionRepository extends JpaRepository<Transaction, Long> {
}
package shop.mtcoding.bank.domain.user;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
서비스에서 코드 작성하기
서비스에서는 DTO를 받아서 DTO를 내보내는 것을 고정으로
package shop.mtcoding.bank.service;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import shop.mtcoding.bank.domain.user.User;
import shop.mtcoding.bank.domain.user.UserEnum;
import shop.mtcoding.bank.domain.user.UserRepository;
import shop.mtcoding.bank.handler.ex.CustomApiException;
@RequiredArgsConstructor
@Service
public class UserService {
private final Logger log = LoggerFactory.getLogger(getClass());
private final UserRepository userRepository;
private final BCryptPasswordEncoder passwordEncoder;
@Transactional
public JoinResponseDto 회원가입(JoinRequestDto joinRequestDto) {
// 1. 동일 유저네임 검사
Optional<User> userOP = userRepository.findByUsername(joinRequestDto.getUsername());
if (userOP.isPresent()) {
throw new CustomApiException("동일한 유저네임이 존재합니다. ");
}
// 2. 패스워드 인코딩 + 회원가입
User userPS = userRepository.save(joinRequestDto.toEntity(passwordEncoder));
// 3. dto 응답
return new JoinResponseDto(userPS);
}
@Getter
@Setter
public static class JoinResponseDto {
private Long id;
private String username;
private String fullname;
public JoinResponseDto(User user) {
this.id = user.getId();
this.username = user.getUsername();
this.fullname = user.getFullname();
}
}
@Getter
@Setter
public static class JoinRequestDto {
// 유효성 검사
private String username;
private String password;
private String email;
private String fullname;
public User toEntity(BCryptPasswordEncoder passwordEncoder) {
return User.builder()
.username(username)
.password(passwordEncoder.encode(password))
.email(email)
.fullname(fullname)
.role(UserEnum.CUSTOMER)
.build();
}
}
}
findByusername에 대한 코드 작성, * 네임드 쿼리 찾아보기
네임드 쿼리
void findByUsername(String username);
public interface UserRepository extends JpaRepository<User, Long> {
// select * from user where username = ?
Optional<User> findByUsername(String username);
}
예외처리하는 핸들러 필요해서 만들기
package shop.mtcoding.bank.handler.ex;
public class CustomApiException extends RuntimeException {
public CustomApiException(String message) {
super(message);
}
}
package shop.mtcoding.bank.handler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import shop.mtcoding.bank.dto.ResponseDto;
import shop.mtcoding.bank.handler.ex.CustomApiException;
@RestControllerAdvice
public class CumstomExceptionHandler {
private final Logger log = LoggerFactory.getLogger(getClass());
@ExceptionHandler(CustomApiException.class)
public ResponseEntity<?> apiException(CustomApiException e) {
log.error(e.getMessage());
return new ResponseEntity<>(new ResponseDto<>(-1, e.getMessage(), null), HttpStatus.BAD_REQUEST);
}
}