회원가입 구현 : save() 만들어 DB에 insert하기

Jan 30, 2024
회원가입 구현 : save() 만들어 DB에 insert하기

1. 메모리에 띄우기

notion image
  • 시작시 ComponentScan 시작
기준점 shop.mtcoding.blog이하
  • 디폴트 생성자를 때려서 @Controller를 메모리에 띄움
→ IoC 컨테이너에 뜸
USER는 안들어옴
UserController는 뜸
UserRepository는 띄우려니 생성자가 문제 → 파라미터를 넣어줘야함
디폴트 생성자가 아니라 파라미터가 필요한 생성자
  • 리플렉션으로 찾아봄
EntityManager는 이미 Ioc에 떠있음
→ for문을 돌려서 IoC 컨테이너에서 찾아서 주입해줌 / 의존성 주입
 

2. 의존성 주입(Dependency Injection, DI)

: 객체 간의 의존 관계를 외부에서 주입하는 것
 
의존성 주입하는 방법
  • 생성자 주입(Constructor Injection):
@Autowired : 스프링에서 해당 타입의 빈(객체)을 찾아 주입
private final HttpSession session;
  • @RequiredArgsConstructor 어노테이션 : 파이널 필드를 가진 클래스에 대한 생성자를 자동으로 생성
  • @Qualifier 어노테이션 특정 빈을 주입받도록 지정할 수 있음
💡
정리…
1. ioc컨테이너에 띄울 때 사용하는 어노테이션 → new 해줌
2. new 해줄 때 생성자가 디폴트가 없으면 new 를 스프링이 함
3. 생성자가 있으면 무조건 생성자를 때려야 함
4. 스프링이 생성자를 때리려고 하니까 파라미터를 가지고 있고 넣어줘야만 new 가 됨
5. 생성자 주입을 통해 이루어짐
6. IoC컨테이너에 있는 것 갖다 쓰는게 의존성 주입
 

3. UserRepository에 sava()메서드 구현하기

  • @Repository
스프링 프레임워크에서 제공하는 어노테이션
해당 클래스가 데이터 액세스 작업을 수행하는 리포지토리 클래스임을 나타냄
  • EntityManager
JPA에서 엔티티 매니저를 나타내는 인터페이스
JPA를 사용하여 엔티티 객체를 데이터베이스에 저장, 수정, 조회 등의 작업을 수행하는 인터페이스
  • 의존성 관리를 위한 컴포지션 사용
package shop.mtcoding.blog.user; import jdk.swing.interop.SwingInterOpUtils; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; @Repository // 내가 new 하지 않아도 메모리에 띄울 수 있음 public class UserRepository { private EntityManager em; // 컴포지션 public UserRepository(EntityManager em) { // 생성자 this.em = em; } public void save(UserRequest.JoinDTO requestDTO) { // 컨트롤러는 정보를 전달하면서 때리고 위임함 System.out.println("UserRepository에 save 메서드 호출됨"); } }
 

4. UserController에 join에서 save() 호출하기

  • UserRepository를 컨트롤러에 주입
→ 컨트롤러는 UserRepository를 사용하여 데이터베이스와 상호작용 가능
  • userRepository가 null
생성자를 만들어서 디폴트 생성자를 없애기
package shop.mtcoding.blog.user; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @Controller public class UserController { private UserRepository userRepository; // null 이기에 생성자 만들기 public UserController(UserRepository userRepository) { //IOC 컨테이너에서 써치해서 찾아서 넣어줌 this.userRepository = userRepository; } // 생성자를 만들어서 디폴트 생성자를 없애버림 @GetMapping("/joinForm") public String joinForm() { return "user/joinForm"; } @PostMapping("/join") public String join(UserRequest.JoinDTO requestDTO) { System.out.println(requestDTO); // 1. 유효성 검사 if (requestDTO.getUsername().length() < 3) { return "error/400"; } userRepository.save(requestDTO); // 모델에 위임하기 return "redirect:/loginForm"; //리다이렉션불러놓은게 있어서 다시부른거 } @GetMapping("/loginForm") public String loginForm() { return "user/loginForm"; } @GetMapping("/user/updateForm") public String updateForm() { return "user/updateForm"; } @GetMapping("/logout") public String logout() { return "redirect:/"; } }
notion image
 

3. UserRepository에 DB insert 코드 작성

package shop.mtcoding.blog.user; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @Repository // 내가 new 하지 않아도 메모리에 띄울 수 있음 public class UserRepository { private EntityManager em; // 컴포지션 public UserRepository(EntityManager em) { // 생성자 this.em = em; } @Transactional // DB에 변경을 초래할 떄 사용 public void save(UserRequest.JoinDTO requestDTO) { // 컨트롤러는 정보를 전달하면서 때리고 위임함 System.out.println("UserRepository에 save메서드 호출됨"); Query query = em.createNativeQuery("insert into user_tb(username, password, email) values (?, ?, ?)"); query.setParameter(1, requestDTO.getUsername()); query.setParameter(2, requestDTO.getPassword()); query.setParameter(3, requestDTO.getEmail()); query.executeUpdate(); } }
입력한 값이 테이블에 삽입됨
notion image
notion image
 

4. save2() 만들기

  • 통신을 통해 받은 데이터를 entity를 만들어서 담아보기
package shop.mtcoding.blog.user; import jdk.swing.interop.SwingInterOpUtils; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.transaction.Transactional; @Repository // 내가 new 하지 않아도 메모리에 띄울 수 있음 public class UserRepository { private EntityManager em; // 컴포지션 public UserRepository(EntityManager em) { // 생성자 this.em = em; } @Transactional public void save(UserRequest.JoinDTO requestDTO) { // 컨트롤러는 정보를 전달하면서 때리고 위임함 Query query = em.createNativeQuery("insert into user_tb(username, password, email) values (?, ?, ?)"); query.setParameter(1, requestDTO.getUsername()); query.setParameter(2, requestDTO.getPassword()); query.setParameter(3, requestDTO.getEmail()); query.executeUpdate(); } @Transactional public void saveV2(UserRequest.JoinDTO requestDTO) { User user = new User();// 통신을 통해 받은 데이터를 entity를 만들어서 담아보기 user.setUsername(requestDTO.getUsername()); user.setUsername(requestDTO.getPassword()); user.setUsername(requestDTO.getEmail()); em.persist(user); } }
notion image
Share article
RSSPowered by inblog