Spring boot

2024.10.10 Blog 프로젝트 만들기(JPA) 회원 가입 기능 만들기

정훈5 2024. 10. 10. 10:51

 

학습 목표 
JPA를 활용하여 회원가입 기능을 구현할 수 있다.

 

 

UserRepository.java

사용자 저장 메서드 추가

더보기
더보기
package com.tenco.blog_v1.user;

import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@RequiredArgsConstructor
public class UserRepository {

    private final EntityManager em;

    /**
     * 사용자 저장 메서드 (JPA API 사용)
     * @param user
     * @return 저장된 사용자 엔티티
     */
    @Transactional
    public User save(User user) {
        // JPQL은 INSERT 구문을 직접 지원하지 않습니다.
        em.persist(user); // 영속화
        return user;
    }

    /**
     * 사용자 이름과 비밀번호로 사용자 조회
     * @param username
     * @param password
     * @return 조회된 User 엔티티, Null
     */
    public User findByUserNameAndPassword(String username, String password) {
        TypedQuery<User> jpql =
                em.createQuery("SELECT u FROM User u WHERE u.username = :username AND u.password = :password", User.class);
        jpql.setParameter("username", username);
        jpql.setParameter("password", password);

        return jpql.getSingleResult();
    }

}

 

JPQL은 INSERT 문을 직접 지원하지 않습니다.

따라서 새로운 엔티티를 데이터베이스에 저장하려면 EntityManager의 persist 메서드를 사용해야 합니다

. 만약 INSERT와 유사한 작업이 필요하다면 Native Query를 사용할 수 있습니다.

그러나 일반적인 경우에는 persist 메서드를 사용하는 것이 권장됩니다.

 

Native Query 사용 예시

@Transactional
public User saveV2(String username, String password, String email){
    Query q1 = em.createNativeQuery("insert into user_tb(username, password, email, created_at) values(?, ?, ?, now())");
    q1.setParameter(1, username);
    q1.setParameter(2, password);
    q1.setParameter(3, email);
    q1.executeUpdate();
    
    Query q2 = em.createNativeQuery("select * from user_tb where id = (select max(id) from user_tb)", User.class);
    User user = (User) q2.getSingleResult();
    return user;
}

 

UserDTO.java

User 엔티티 변환 메서드 추가

더보기
더보기
package com.tenco.blog_v1.user;

import lombok.Data;

@Data
public class UserDTO {

    // 정적 내부 클래스로 모으자
    @Data
    public static class LoginDTO {
        private String username;
        private String password;
    }

    // 정적 내부 클래스로 모으자
    @Data
    public static class JoinDTO {
        private String username;
        private String password;
        private String email;

        public User toEntity() {
            return User.builder()
                    .username(this.username)
                    .password(this.password)
                    .email(this.email)
                    .build();
        }
    }
}

 

UserController.java

join() 메서드 추가

더보기
더보기
    @PostMapping("/join")
    public String join(@ModelAttribute(name = "joinDTO") UserDTO.JoinDTO reqDto) {
        userRepository.save(reqDto.toEntity());

        return "redirect:/login-form";
    }