개발

[Spring Boot] MySQL DB와 연동하기

changha. 2023. 2. 10. 15:15

이전 게시글에서 

https://changha-dev.tistory.com/146

 

[Spring Boot ] 웹페이지 정보 -> Controller (http method)

전 게시글 https://changha-dev.tistory.com/145 에 이어 이번에는 [Spring Boot] 스프링부트 환경세팅 후 웹페이지 실행 스프링부트 이용하여 웹페이지 띄우기 먼저 IntelliJ 가 설치되어 있다는 전제로 시작하

changha-dev.tistory.com

웹페이지에서 입력한 정보를 Controller에 가져오는 것까지 해봤습니다. 

 

이번에는 가져온 정보를 DB에 저장하는 것을 해보겠습니다. 

(MySQL WorkBench 설치 및 사용방법은 생략)

 

스프링 MVC패턴을 기반으로 하여 

1. Service 로 DTO 전달

2. Service

 

먼저 dto, entity, repository, service 이렇게 package를 생성하고 각각 class도 만들어 주겠습니다. 

package com.example.member.dto;


import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

//lombok dependency추가
@Getter
@Setter
@NoArgsConstructor
@ToString
public class MemberDTO { //회원 정보를 필드로 정의
    private Long id;
    private String memberEmail;
    private String memberPassword;
    private String memberName;

    //lombok 어노테이션으로 getter,setter,생성자,toString 메서드 생략 가능
    
    public static MemberDTO toMemberDTO(MemberEntity memberEntity){
        MemberDTO memberDTO = new MemberDTO();
        memberDTO.setId(memberEntity.getId());
        memberDTO.setMemberEmail(memberEntity.getMemberEmail());
        memberDTO.setMemberName(memberEntity.getMemberName());
        memberDTO.setMemberPassword(memberEntity.getMemberPassword());

        return memberDTO;
    }
}
//MemberDTO.class

DTO란 : 데이터 전송 객체(Data Transfer Object), 프로세스 간에 데이터를 전달하는 객체 => Client <-> Controller 사이,                  Controller <-> Service 사이 처럼 단순히 데이터 전달 목적.

@Controller
@RequiredArgsConstructor //MemberService에 대한 멤버를 사용 가능
public class MemberController {

    // 생성자 주입
    private final MemberService memberService;

    // 회원가입 페이지 출력 요청
    @GetMapping("/member/save")
    public String saveForm() {
        return "save";
    }

    @PostMapping("/member/save")    // name값을 requestparam에 담아온다
    public String save(@ModelAttribute MemberDTO memberDTO) {
        System.out.println("MemberController.save");
        System.out.println("memberDTO = " + memberDTO);
        memberService.save(memberDTO);

        return "index";
    }
}
//MemberController.class

save 메서드의 파라미터를 위와 같이 memberDTO로 교체합니다. 

memberService에 memberDTO 를 전달합니다. 

 

@Service //스프링이 관리해주는 객체 == 스프링 빈
@RequiredArgsConstructor //controller와 같이. final 멤버변수 생성자 만드는 역할 
public class MemberService {

    private final MemberRepository memberRepository; // 먼저 jpa, mysql dependency 추가

    public void save(MemberDTO memberDTO) {
        // repsitory의 save 메서드 호출
        MemberEntity memberEntity = MemberEntity.toMemberEntity(memberDTO);
        memberRepository.save(memberEntity);
        //Repository의 save메서드 호출 (조건. entity객체를 넘겨줘야 함)

    }
}
//MemberService.class

위와 같이 적으면 아직 빨간글이 뜨는 부분이 많을 텐데 

아래에서 하나씩 해결하겠습니다. 

 

흐름을 정리하면 

Client(웹페이지) ->

Controller에서 DTO로 받은 후 Service로 전달 ->

Service에서 받은 후 Entity로 바꿔 Repository로 전달 

 

 

이제 JPA, MySQL dependency를 추가하겠습니다. 

build.gradle

 

이후 resoucres 패키지 안에 application.yml 파일을 추가해서 환경세팅 하겠습니다. 

# database 연동 설정
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    #    각자 PC에 만들어놓은 Database이름을 써야 합니다. 
    url: jdbc:mysql://127.0.0.1:3306/db # Database이름 ?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    #    mysql에 생성한 사용자 계정 정보를 써야 합니다.
    username: root
    password: # 자신의 mysql 비밀번호 
  thymeleaf:
    cache: false

  # spring data jpa 설정
  jpa:
    database-platform: org.hibernate.dialect.MySQL57Dialect
    open-in-view: false
    show-sql: true
    hibernate:
      ddl-auto: update

 

MemberService에 있던 MemberEntity 클래스를 entity 패키지 안에 만들어 주겠습니다.

@Entity
@Setter
@Getter
@Table(name = "member_table") //database에 해당 이름의 테이블 생성
public class MemberEntity { //table 역할
    //jpa ==> database를 객체처럼 사용 가능

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // auto_increment
    private Long id;

    @Column(unique = true)
    private String memberEmail;

    @Column
    private String memberPassword;

    @Column
    private String memberName;

    public static MemberEntity toMemberEntity(MemberDTO memberDTO){
        MemberEntity memberEntity = new MemberEntity();
        memberEntity.setId(memberDTO.getId());
        memberEntity.setMemberEmail(memberDTO.getMemberEmail());
        memberEntity.setMemberName(memberDTO.getMemberName());
        memberEntity.setMemberPassword(memberDTO.getMemberPassword());
        return memberEntity;
    }

}
//MemberEntity.class
@Repository / 첫번째 인자 : 어떤 Entity인지, 두번째 인자 : pk 어떤 타입인지
public interface MemberRepository extends JpaRepository<MemberEntity, Long>
{

}
//MemberRepository.interface

              

이제 모든 과정을 완료했으니 실행 해보겠습니다. 

localhost:8080/member/save
MySQL Workbench

 

이상으로 DB연동을 통해 Client에서 DB까지 데이터 저장하는 방법을 알아 보았습니다.