Spring 회원 프로젝트(5) 회원 엔티티 생성 및 DB 연동하기

woohee·2024년 4월 7일

회원 프로젝트

목록 보기
5/9

🔖지난 포스트까지는 회원가입 페이지를 요청하고 생성하여 사용자가 입력한 정보 값을 가져오는 것까지 수행하였다. 이번에는 가져온 값을 DB에 저장하기 위해서 회원 entity를 생성하고 DB를 연동하는 과정을 해볼 것이다!


📖DTO, Entity, Repository, Service 개념

DTO

Data Transfer Object로 데이터 전송 객체이다.

  • 데이터 저장 담당 클래스
  • 계층간에 데이터를 교환할 때 주로 사용된다.
  • 객체지향에 매우 적합하기에 사용한다.
  • 로직을 갖고 있지 않고 순수한 데이터 객체이다.
  • 오직 getter,setter 메소드만을 가지고 있다.

Entity

DB에 접근하는 객체

Entity와 DTO를 분리하는 이유?

하나로 쓰게 되면 변경된 값이 DB에 들어갈 수 있다. 그래서 변경이 많은 경우에는 Entity아 DTO를 구분하는게 좋다.

Repository

DB에 CRUD 명령을 실행하게 만드는 인터페이스

  • DB 관리(연결, 해제, 자원 관리)
  • '저장소'라는 뜻을 가진 단어로 JPA에서 Repository 인터페이스를 생성한 후, JpaRepository<Entity, 기본키 타입>을 상속받으면 기본적인 CRUD가 자동으로 생성된다.

Service

repository와 controller 사이 미들웨어

  • controller에서 받은 데이터를 가공해서 db에 보내거나 db에서 가져온 데이터를 가공해서 사용자에게 보내준다.
  • 사용자 요구사항을 처리하는 곳
  • DB 정보가 필요할 때 repostiroy에게 요청한다.

📖JPA란?

Jpa는 Java Persistence API의 약자이며, 자바 영속성 API를 뜻한다.

  • JDBC를 이용하여 데이터베이스를 관리하는 인터페이스이고 이를 구현한 구현체로 대표적인 것이 Hibernate이다.
  • 자바 ORM 기술의 표준 API이다.

ORM이란?

Object-Relational Mapping의 약자로 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 말한다.

  • 객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.
  • ORM을 사용하면 SQL Query가 아닌 직관적인 코드(메서드)로서 데이터를 조작할 수 있다.

Spring Data JPA란?

JPA를 더 추상화시켜 개발 용이성을 올려주는 인터페이스이다.

  • Repository라는 인터페이스를 제공한다.
  • Repository를 정해진 규칙으로 인터페이스를 선언하기만 해도 자동으로 내부에서 구현체를 만들어 동작시켜준다.
  • 자주 사용하는 메서드들을 별도로 선언하지 않아도 사용할 수 있다. ex(findAll(), save(), delete())
public interface MemberRepository extends JpaRepository<Member, Long> {
	List<Member> findByUsername(String username);
}
  • JpaRepository<엔티티, PK type>
  • findByUsername(String username): 인터페이스를 선언하면 해당 메서드를 내부에서 자동으로 만들어 준다.

JDBC란?

DB에 접근할 수 있도록 자바에서 제공하는 API

  • application.yml에 다음 코드를 추가하여 DB와 통신할 수 있다.
spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/datajpa
   username: sa
    password:
    driver-class-name: org.h2.Driver

🗝️위의 개념을 알기 전에는 MySQL에서 Sql문을 통해서 테이블을 생성하고 Springboot와 DB를 연결하는 줄 알았다. 물론 그렇게 사용하는 경우도 있지만 우리는 지금 Spring Data JPA를 사용할 것이므로 query문을 직접 작성하지 않고 엔티티를 활용함으로써 테이블을 생성할 수 있다는 것을 새롭게 알게 됐다!

🖥️ 회원 엔티티, dto, repository, service 생성

member 폴더 아래에 dto, entity, repository, service 폴더를 각각 생성해주자.
각각의 폴더에 들어가는 자바 클래스는 아래와 같다.

MemberDTO.java

@Getter
@Setter
@NoArgsConstructor //기본생성자 생성
@AllArgsConstructor   // 모든 필드를 가지는 생성자 생성
@ToString
public class MemberDTO {
    private Long id;
    private String memberEmail;
    private String memberPassword;
    private String memberName;
}
  • 로직이 없고 순수한 데이터 객체이다.
  • id, memberEmail, memberPassword, memberName 의 필드를 가지고 있다.

MemberEntity.java

@Entity
@Setter
@Getter
@Table(name ="member_table")
public class MemberEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) //auto_increment
    private Long id;

    @Column(unique =true) //unique 제약조건 추가
    private String memberEmail;

    @Column
    private String memberName;
}
  • member_table이라는 회원 테이블 생성
  • type과 pk 지정하여 테이블 생성

Repository는 interface로 구현한다.

MemberRepository.java

public interface MemberRepository extends JpaRepository<MemberEntity, Long> {
}
  • JpaRepository를 상속받는 MemberRepository 생성
  • CRUD를 자동으로 생성해준다.

MemberService.java

@Service
@RequiredArgsConstructor
public class MemberService {
    private final MemberRepository memberRepository;
    public void save(MemberDTO memberDTO) {

    }
}

⛓️DB 연동

Dependencies 추가

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'mysql:mysql-connector-java:8.0.33'
  • jpa와 mysql 의존성 추가
  • jar 버전에 따라 8.0.33 -> 본인 버전 으로 수정하면 된다.

application.yml 수정

server:
  port: 8081

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

  # spring data jpa 설정
  jpa:
    database-platform: org.hibernate.dialect.MySQLDialect
    open-in-view: false
    show-sql: true
    hibernate:
      ddl-auto: create
  • com.mysql.cj.jdbc.Driver에서 오류가 무척 많이 났다..
    일단 jar파일을 라이브러리에 추가하지 않아서 문제가 발생했고 추가했지만 버전이 맞지 않아서 오류가 계속 났다.
    특히 MySQLDialect가 원래는 MySQL5~였는데 MySQL8로 고쳐도 오류가 났었다. 하지만 MySQLDialect로 통합되어서 수정하니까 오류가 발생하지 않았다.

✅ 테이블 확인


실행시키고 보니 mysql에 테이블이 생성된 것을 확인할 수 있다.


이렇게 DB연동까지 마쳤다.
DB연동이 안돼서 오류 수정하느라 시간이 많이 소요 됐다...
다음 포스트부터는 db에 값을 넣어보겠다!!

0개의 댓글