티스토리 뷰

Server

Java 의 LocalDateTime과 Hibernate

니용 2021. 6. 23. 18:00
반응형

이전 글에서 Java의 LocalDateTime에 대하여 정리를 하였습니다. 이를 실제 업무에 적용해서 사용할 때는 소스부분의 내용보다는 주로 Database와 연결되어 값을 비교하거나 데이터를 넣어주는, 즉 SELECT, INSERT 및 UPDATE 쿼리를 주로 사용할 것입니다.

MyBatis vs Hibernate

MyBatis와 같은 DB Mapper를 사용할 때는 테이블의 설계를 미리 진행하고 각각에 맞게 쿼리를 작성해주기 때문에 문제가 되지 않을 것입니다. Hibernate(JPA)의 경우는 테이블 생성의 옵션을 소스에서 직접 설정하고 자동으로 생성이 되는 차이가 있기 때문에 JPA를 사용하였을 때 Mapping 되는 컬럼의 타입이 달라지게 됩니다. 이렇게 되면 선택지가 2개가 생깁니다.

  1. Hibernate 세팅에서 문제가 없도록 설정한다. 
  2. Database 세팅을 먼저하고 소스를 맞춘다.

위 두 가지중 사실 2번의 경우는 MyBatis를 쓰는 것이 더 효율적입니다. Hibernate를 쓰는 것이 큰 의미가 없습니다. 이번 글에서는 1번의 경우를 바탕으로 하여 DTO 세팅을 어떻게 하는 것이 좋을 지 고민하면서 작성해보려 합니다.


가장 먼저 확인해볼것은 Hibernate에서 제공해주는 공식 문서의 링크입니다.

https://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#basic

 

Hibernate ORM 5.0 User Guide

Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat

docs.jboss.org

 

가장 먼저 의존성을 추가합니다.

build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    // https://mvnrepository.com/artifact/mysql/mysql-connector-java
    implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.25'
}

이제 코드를 작성해보겠습니다. 심플하게 DTO를 만들어보겠습니다.

LocalDateDto.java

package com.example.jpa.dto;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDate;
import java.time.LocalDateTime;

@Entity
@Table(name = "localdate")
public class LocalDateDto {
    @Id
    @GeneratedValue
    private Long id;
    private LocalDateTime createdTimeAt;
    private LocalDate createdDateAt;
    public LocalDateDto() {
        createdDateAt = LocalDate.now();
        createdTimeAt = LocalDateTime.now();
    }

    public LocalDateDto(LocalDate createdDateAt, LocalDateTime createdTimeAt) {
        this.createdDateAt = createdDateAt;
        this.createdTimeAt = createdTimeAt;
    }
}

그리고 이를 호출해주기 위한 Controller를 만듭니다.

LocalDateController.java

package com.example.jpa.controller;

import com.example.jpa.dto.LocalDateDto;
import com.example.jpa.repository.LocalDateRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Map;

@RequestMapping
@RestController
public class LocalDateController {

    @Autowired
    private LocalDateRepository localDateRepository;

    @PostMapping
    LocalDateDto create() {
        LocalDateDto create = new LocalDateDto();
        return localDateRepository.save(create);
    }

    @PostMapping("/create")
    LocalDateDto create(@RequestBody Map<String, Object> param) {
        LocalDate createdDateAt = (LocalDate) param.get("createdDateAt");
        LocalDateTime createdTimeAt = (LocalDateTime) param.get("createdTimeAt");
        LocalDateDto create = new LocalDateDto(createdDateAt, createdTimeAt);
        return localDateRepository.save(create);
    }

}

LocalDateRepository.java

package com.example.jpa.repository;

import com.example.jpa.dto.LocalDateDto;
import org.springframework.data.jpa.repository.JpaRepository;

public interface LocalDateRepository extends JpaRepository<LocalDateDto, Long> {
}

그리고 Postman에서 요청을 보내면 테이블을 아래와 같이 생성하고 데이터가 입력되는 것을 확인할 수 있습니다.

위의 그림을 보시면 자동으로 생성된 타입이 date, datetime(6) 으로 생성된 것을 볼 수 있습니다. 다른 설정을 하지 않으면 기본 타입값이 저렇게 입력이 되나 봅니다! 그러면 값을 가져오는 것은 과연 정상적으로 가져올 것인지 테스트해보도록 하겠습니다. 먼저 이를 가져오기전에 Getter, Setter를 넣어주어야 하겠죠.

package com.example.jpa.dto;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDate;
import java.time.LocalDateTime;

@Entity
@Table(name = "localdate")
public class LocalDateDto {
    @Id
    @GeneratedValue
    private Long id;
    private LocalDateTime createdTimeAt;
    private LocalDate createdDateAt;
    public LocalDateDto() {
        createdDateAt = LocalDate.now();
        createdTimeAt = LocalDateTime.now();
    }

    public LocalDateDto(LocalDate createdDateAt, LocalDateTime createdTimeAt) {
        this.createdDateAt = createdDateAt;
        this.createdTimeAt = createdTimeAt;
    }

    public Long getId() {
        return id;
    }

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

    public LocalDateTime getCreatedTimeAt() {
        return createdTimeAt;
    }

    public void setCreatedTimeAt(LocalDateTime createdTimeAt) {
        this.createdTimeAt = createdTimeAt;
    }

    public LocalDate getCreatedDateAt() {
        return createdDateAt;
    }

    public void setCreatedDateAt(LocalDate createdDateAt) {
        this.createdDateAt = createdDateAt;
    }

    public LocalDateDto(Long id, LocalDateTime createdTimeAt, LocalDate createdDateAt) {
        this.id = id;
        this.createdTimeAt = createdTimeAt;
        this.createdDateAt = createdDateAt;
    }
}

이렇게 하고 Controller도 GetMapping을 하나 추가합니다.

    ...
    @GetMapping("/{id}")
    ResponseEntity<LocalDateDto> read(@PathVariable long id) {
        Optional<LocalDateDto> dto = localDateRepository.findById(id);
        return ResponseEntity.ok(dto.orElse(new LocalDateDto()));
    }
    ...

이렇게 진행해보니 잘 작동하는 것을 확인할 수 있습니다. 

참고하였던 문서는 여기에 있고, GitHub 주소는 여기에 있습니다!

반응형
댓글
공지사항