[Spring + MySQL + JPA] 간단한 회원정보 입력받기

Dev_ch·2022년 11월 4일
0
post-thumbnail
본 글은 2022.07.17에 작성된 게시글 입니다.

서버도 준비가 되었으니, 이제 spring boot를 통해 값을 입력받고 mysql server에 데이터를 저장해보도록 하자. 그전에 글에 대한 이해도를 높이기 위해 아래의 강의를 전부 완독하고 온다면 정말 좋을 것이다. 참고로 이 글은 SpringDataJpa를 사용하지 않았다.

김영한님의 스프링 입문 강의

1. 구현


프로젝트 패키지 구조

이번 프로젝트에선 View를 사용하지 않고 포스트맨으로 값을 입력받고 데이터가 잘 저장되는지 확인을 해보려고 한다. mvc의 형식으로 직접 form을 만들어 데이터를 주고받고 싶다면 위에 강의를 완독 하도록 하자.

일단 첫 번째로 domain에 User.java 클래스를 통해 입력받을 값들을 작성한다.

User.java

package study.part1.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;

@Entity
public class User {

    @Id@GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name,email;

    private LocalDateTime rog_date,mod_date;

    public LocalDateTime getRog_date() {
        return rog_date;
    }

    public void setRog_date(LocalDateTime rog_date) {
        this.rog_date = rog_date;
    }

    public LocalDateTime getMod_date() {
        return mod_date;
    }

    public void setMod_date(LocalDateTime mod_date) {
        this.mod_date = mod_date;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

Lombok은 사용하지 않았다

sql을 통해 만들어둔 테이블 내의 컬럼들을 바탕으로 변수들을 생성해준다. 우리는 테이블을 생성할 때 각각, id, email, name, rod_date, mod_date 만들었기에 위와 같이 설정해주며 이 프로젝트는 JDBC 가 아닌 JPA를 이용하여 sql을 이용할 것이므로 DB 테이블에 User.java 클래스를 대응시켜주어야 하므로 @Entity를 클래스 위에 작성해주자.

또한 전편에서 얘기한 것처럼 id에 자동 증가를 위해 @GeneratedValue(GenerationType.IDENTITY)를 id 값에 설정해주도록 하자.

위에서 @id 값은 테이블 내에서 PK(primary key)를 설정하는 것과 같은 의미라고 보면 된다.

UserRepository.java

public interface UserRepository {
User save (User user);
}

현재 우리는 정보를 조회하거나 삭제하는 서비스는 구현하지 않고 오로지 저장만 할 것이기에 UserRepository에 User에 save 하는 메소드를 하나만 정의해두자.

JpaUserRepository.java

package study.part1.Repository;

import study.part1.domain.User;

import javax.persistence.EntityManager;

public class JpaUserReopsitory implements UserRepository{
    private final EntityManager em;

    public JpaUserReopsitory(EntityManager em) {
        this.em = em;
    }

    public User save(User user) {
        em.persist(user);
        return user;
    }
}

이제 실질적으로 코드를 구현한 JpaUserRepository.java를 살펴보도록 하면, EntityManger를 먼저 선언을 하도록 하자. EntityManger란 우리가 만들어둔 Entity들의 상태를 전환시키는 데 사용된다. 자세한 사항은 아래 사이트를 참고하면 된다.

Hibernate JPA EntityManager 핵심 기능 정리

EntityManger를 선언했다면 생성자 매개변수를 추가한 후에 UserRepository에 정의한 인터페이스를 구현하면 된다. EntityManager.persist()를 통하여 data가 spring에 연결해둔 datebase에 insert 되도록 구현해놨다.

그렇다면 실질적으로 실행할 서비스를 구현할 UserService를 살펴보도록 하자.

UserService.java

package study.part1.Service;

import study.part1.Repository.JpaUserReopsitory;
import study.part1.Repository.UserRepository;
import study.part1.domain.User;

import javax.transaction.Transactional;

@Transactional // 서비스에 작성하여 항상 트랙잭션을 거쳐야함.
public class UserService {
private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public Long join(User user) {
        userRepository.save(user);
        return user.getId();
    }
}

첫 번째로 @Transactional을 클래스에 선언해준다, @Transactional 경우 클래스나 메소드에 선언하면, 해당 범위 내 메소드가 트랜잭션이 되도록 해주는데 자세한 사항은 아래 사이트를 참고하도록 하자.

@Transactional 어노테이션의 이해

이후에 UserRepository를 사용할 수 있게끔 생성자 매개변수를 추가해주고 회원정보 입력 서비스를 메소드로 구현해준다.

그리고 구현해놓은 Repository와 service를 스프링에서 사용하기 위해 클래스들을 Bean으로 등록해야 하기에 SpringConfig라는 클래스를 통해 Bean을 등록하도록 하자.

SpringConfig.java

package study.part1;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import study.part1.Repository.JpaUserReopsitory;
import study.part1.Repository.UserRepository;
import study.part1.Service.UserService;

import javax.persistence.EntityManager;
import javax.sql.DataSource;

@Configuration
public class SpringConfig {
    private final EntityManager em;

    public SpringConfig(EntityManager em) {
        this.em = em;
    }

    @Bean
    public UserService userService(){
        return new UserService(userRepository());
    }

    @Bean
    public UserRepository userRepository(){
        return new JpaUserReopsitory(em);
    }
}

@Configuration을 통하여 빈 설정을 담당하는 클래스로 만들어 준다. 이 클래스 안에서 @Bean을 메소드에 선언하게 되면, 그 메소드를 통해 스프링 빈을 정의하고 생명주기를 설정하게 된다.

마지막으로 Controller 부분을 보도록 하자.

UserController.java

package study.part1.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import study.part1.Service.UserService;
import study.part1.domain.User;

import java.time.LocalDateTime;

@Controller
public class UserController {
private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping(value = "/create")
    @ResponseBody
    public User create(@RequestBody User form){
        User user1 = new User();
        user1.setName(form.getName());
        user1.setEmail(form.getEmail());
        user1.setMod_date(LocalDateTime.now());
        user1.setRog_date(LocalDateTime.now());

        userService.join(user1);
        return user1;
    }
}

해당 클래스가 컨트롤러임을 스프링이 알 수 있도록 @Controller 어노테이션을 클래스에 선언해준다.

이후 userService를 사용하기 위해 생성자 매개변수를 추가한다. 그다음 @PostMapping과 @ResponseBody를 통해 맵핑 형식과 JSON으로 값을 return 하게 끔 설정해두고 create 메소드를 보게 되면 @RequestBody를 통하여 User 데이터를 입력받으며

생성자를 통해 객체를 생성하여 입력받은 data를 각각 객체에 설정해준다. id의 경우 자동 증가하며, mod_date와 Rog_date의 경우 현재시간을 설정하도록 하기에 입력받는 값은 name, email 만 받으면 된다.

그리고 userSerivce에 만들어둔 메소드를 호출하여 user1이라는 객체를 넘겨주면 repository를 통하여 내가 만들어둔 sql table에 값이 입력되게 된다.

2. 잡담


이렇게 정말 간단하게 spring boot와 mysql을 연동해 데이터를 주고받는 것을 구현해보았다. 개발을 공부하면서 보통 코드를 가져오거나 강의를 통해 따라 치는 것은 누구나 할 수 있다. 역시 가장 중요한 점은 어떠한 메커니즘으로 인해 프로젝트가 실행이 되는지 코드가 어떤 식의 흐름이고 어떻게 작동하는지를 잘 파악하는 것이 가장 중요한 것 임을 항상 느낀다. 내가 공부하는 코드에 대해 정확히 알고 흐름을 이해하게 되면 어디선가 코드를 가져오는 것이 아니라 직접 하나부터 열 까지 만들 수 있게 된다.

이러한 점들을 통해 공부하는 법에 대해서도 점점 알아가는 거 같다, 특히 까먹기 쉽거나 이해되지 않는 부분은 블로그에 작성하면서 좀 더 알아가기도 하고 잊지 않게 되는 것 같다.

profile
내가 몰입하는 과정을 담은 곳

0개의 댓글