레포지토리에서 쓰기할 때 항상 써줫던@Transactional

이제는 서비스에서 작성해야 한다.

서비스 작성하기

package shop.mtcoding.blog.user;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import shop.mtcoding.blog._core.errors.exception.Exception400;

import java.util.Optional;

@RequiredArgsConstructor
@Service // IoC 에 등록된다.
public class UserService {

    // 의존성 주입
    private final UserJAPRepository userJAPRepository;

	  @Transactional
		public void join(UserRequest.JoinDTO requestDTO) {
		
		    // 유저네임 중복검사
		    // 여기에 orElseThrow 를 못쓰는 이유는 찾았을 때 쓰로우를 날려야 하기 때문 위랑 다르다
		    Optional<User> userOP = userJAPRepository.findByUsername(requestDTO.getUsername());
		    
		    // 회원가입 할 때 유저 네임이 같은게 있으면 안됨, 비정상.
		    if (userOP.isPresent()) {
		        throw new Exception400("중복된 유저네임입니다.");
		    }
		
		    userJAPRepository.save(requestDTO.toEntity());
		}
}

유저 컨트롤러 join 수정

@PostMapping("/join")
public String join(UserRequest.JoinDTO requestDTO) {
    userService.join(requestDTO);
    return "redirect:/";
}

잘 되는지 확인

Untitled

Untitled

회원가입도 잘된다.

로그인 구현

public User login(UserRequest.LoginDTO requestDTO) {
    // 해시검사 비교 여기에 들어간다.
    
    // 내가 ssar 1234 를 넣으면 옵셔널에 값이 들어가고
    // 내가 ssar 12345 를 넣으면 옵셔널에 값이 null 이된다.
    // orElseThrow 은 입셉션을 뛰워줄 수 있다. 값이 null 이면 쓰로우를 날리고 아니면 값을 받는다.
    User sessionUser = userJAPRepository.findByUsernameAndPassword(requestDTO.getUsername(),
            requestDTO.getPassword()).orElseThrow(() -> new Exception401("인증되지 않았습니다."));

    return sessionUser;
}

컨트롤러 수정