본문 바로가기

개인프로젝트 - Planify

Planify - JPA를 사용하여 데이터베이스와 직접 매핑

JPA(Java Persistence API)

Java 객체와 DB 엔티티(테이블) 자체를 그대로 매핑해서 처리할 수 있는 접근 방식을 채택한 새로운 기술표준

JPA의 접근 방식은 ORM(Object-Relational Mapping) 기술을 의미한다. 즉, 객체와 데이터베이스 간의 매핑 기술을 의미, Java 개발자가 좀 더 객체지향 관점에서 개발할 수 있게 하고, 개발을 용이하게 해주어서 DB와 Java간의 불일치를 해소해 준다.

MyBatis와 다르게 SQL 문의 작성이 불필요하며 ORM 내부적으로 java 메소드에 적합한 SQL 문이 자동으로 생성이 되어 실행되게 된다. Java 개발자는 클래스만 만들어서 사용하고, ORM 프레임워크가 자동으로 관련된 SQL을 만들어 준다고 한다.

그래서 찾아봤는데
자동으로 SQL을 만들어 준다고 했으니 설정 값을 어떻게 해야하나..?

spring:
  jpa:
    hibernate:
      ddl-auto: update  # or create

 

update 또는 create 옵션을 사용하면 JPA가 엔티티 기반으로 테이블을 자동으로 생성해준다고 한다. => DBeaver에서 수동으로 테이블을 만들 필요없음!

그동안에는 직접 테이블을 생성하고 연결했는데 이렇게 되면 테스트 데이터도 프로젝트 실행 시 자동으로 데이터 삽입도 가능하게 된다.

근데 주의해야할 점은 복잡한 쿼리를 만들어야 하는데 여러 테이블을 Join해서 데이터 결과를 가져와야 하는 경우에, JPA로는 복잡한 쿼리를 만드는 데는 용이하지 않음

뭐.. 일단 JPA로 사용하다가, 복잡해질때는 MyBatis를 같이 사용해보자 가능하다고 함!

사실 어떻게 쓰이는지 배우려고 적용하는거니 거기에 의미를 두자

 

 


@Entity
@Table(name = "member")  // 테이블명 지정
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본키 자동 생성
    private Long id;

    @Column(nullable = false, unique = true, length = 50)
    private String loginId;

 

이렇게 해서 JPA 사용하고 있고,

잘들어갔나 DBeaver에서 SELECT * FROM member; 해서 확인해봤는데

 

잘 매핑되는 것은 확인되었지만, 카멜 표기법으로 작성한 속성이 자동으로 login_id 처럼 변환되는 것을 확인할 수 있다. 혹시 나중에 에러가 발생할 수 있으니 이 점을 잘 기억해두고, 만약 'DB 속성값이 일치하지 않는다'는 에러가 발생하면 1순위로 확인해 보자

테스트 데이터 자동 삽입

@Component
public class DataInitializer implements CommandLineRunner {

    @Autowired
    private MemberRepository memberRepository;

    @Override
    public void run(String... args) throws Exception {
        if (memberRepository.count() == 0) {  // 기존 데이터가 없을 때만 실행
            memberRepository.save(Member.builder()
                    .loginId("user01")
                    .name("김민준")
                    .email("minjun01@example.com")
                    .password("password123")
                    .authLevel(1)  // 일반 사용자
                    .build());

 

확인 완료!!