Mybatis vs JPA
MySQL 데이터베이스를 연결하는 방법으로 두 가지 중 어떤 방법을 선택할지 고민했습니다.
Mybatis는 직접 쿼리를 작성한 후 XML 또는 어노테이션을 사용해서 데이터 맵핑을 하는 방법이고,
JPA는 객체와 관계형 데이터베이스 간의 매핑을 제공해주어서 쿼리를 작성할 필요가 없습니다.
Mybatis를 사용해봤던 경험으로 저는 Mybatis를 사용하면서 장기간 프로젝트를 이어나가면 코드가 조금 복잡할 수 있겠다 생각했습니다. (물론 제가 실력이 부족해서..ㅎㅎ)
JPA를 사용할 경우 얻을 수 있는 장점으로 여러 가지가 있겠지만 저는 밑에 있는 이유 때문에 JPA를 선택했습니다.
- 코드를 더욱 간결하게 만들 수 있습니다.
- 보다 높은 유연성과 확장성을 제공합니다.
아직 JPA를 잘 몰라서 공부하면서 이 장점들을 더 느껴보고자 합니다.
JPA
의존성 추가
JPA를 사용하기 위해서 "spring-boot-starter-data-jpa"를 추가합니다.
MySQL을 연결하기 위해서 "mysql-connector-java"를 추가합니다.
저는 gradle을 사용하기 때문에 다음과 같이 추가했습니다.
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'mysql:mysql-connector-java'
}
여기서 오류가 생긴다면 버전 관련 오류이므로 버전을 확인해주세요!!
DB 정보 입력
application.properties 에 연결할 데이터베이스의 정보를 입력하여 설정합니다.
## 서버 정보
server.address=localhost
server.port=8080
## Database Settings
#### MySQL
spring.datasource.url=jdbc:mysql://DB_IP:DB_port/DB_스키마_이름
spring.datasource.username=DB_유저이름
spring.datasource.password=DB_비밀번호
## JPA Settings
#### JPA => MySQL
spring.jpa.database=mysql
#### 본인 버전에 맞춰줘야 에러가 없습니다.
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
## hibernate logging
logging.level.org.hibernate=info
JPA 관련 설정을 더 보고 싶다면 밑에 블로그를 참고하면 좋습니다.
https://m.blog.naver.com/writer0713/221536526190
Entity 생성
이 테이블과 링크할 엔티티를 생성해 봅시다.
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity(name = "Book")
public class BookEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(length = 45, nullable = false)
private String title;
@Column(length = 45, nullable = false)
private String author;
@Column(nullable = false)
private int page;
private Date release_date;
}
@Entity는 해당 클래스가 테이블과 링크될 클래스임을 나타냅니다.
@ID는 해당 테이블의 PK 필드를 나타냅니다.
@GeneratedValue는 PK 생성 규칙을 나타냅니다.
( AUTO_INCREMENT를 사용한다면 GenerationType.IDENTITY를 해주어야 합니다! )
@Column는 테이블의 칼럼을 나타내며 선언하지 않아도 Entity 클래스의 필드는 모두 칼럼이 됩니다.
( 기본값 외에 변경이 필요한 옵션이 있을 경우에 사용합니다. )
Repository 생성
JpaRepository를 상속받는 인터페이스를 생성해서 사용해 줍니다.
findBy~~ 등의 메서드를 만들면 메서드 이름을 분석해서 JPQL을 생성해 줍니다.
@Repository
public interface BookRepository extends JpaRepository<BookEntity, Long> {
List<BookEntity> findByTitle(String title);
}
참고 - https://exhibitlove.tistory.com/262
테스트 코드 작성
DB에 데이터를 삽입하고 확인하는 테스트 코드를 작성해 봅시다.
@SpringBootTest
public class BookRepositoryTest {
@Autowired
private BookRepository bookRepository;
@BeforeEach
public void cleanup(){
bookRepository.deleteAll();
}
@Test
public void saveBookInfo(){
// Book Imfo
String title = "JPA를 공부합시다.";
String author = "전주호";
int page = 200;
Date releaseDate = Date.valueOf("2023-09-08");
// save info
bookRepository.save(BookEntity.builder()
.title(title)
.author(author)
.page(page)
.release_date(releaseDate).build());
// check info
List<BookEntity> checkBooks = bookRepository.findByTitle(title);
BookEntity checkBook = checkBooks.get(0);
Assertions.assertEquals(title, checkBook.getTitle(), "nope");
Assertions.assertEquals(author, checkBook.getAuthor(), "nope");
Assertions.assertEquals(page, checkBook.getPage(), "nope");
Assertions.assertEquals(releaseDate, checkBook.getRelease_date(), "nope");
}
}
이렇게 데이터를 저장하고 확인해 보니 문제가 없는 것을 확인할 수 있고, DB에도 잘 저장되었습니다.
Assertion 관련 참고 - https://gracelove91.tistory.com/108
마무리
JPA로 가벼운 예제를 만들어서 사용해 보았습니다.
처음 사용하는 방법이어서 약간 어색하지만
확실히 쿼리문이 없으니 코드가 간결하고 이후에 관리하기에 편할 것 같습니다.
JPA의 장점과 Mybatis와의 차이점을 확실히 느낄 수 있었던 시간이었습니다.
Reference
'WEB > Spring' 카테고리의 다른 글
[Spring Boot] API Docs를 자동으로 만들어보자! (1) | 2023.11.25 |
---|---|
[SpringBoot] SpringBoot에 MongoDB 연결 (0) | 2023.09.12 |
[Spring Boot] TDD - JUnit? (0) | 2023.06.27 |
[Spring Boot] Spring Boot에서 TDD 방법론 (0) | 2023.06.23 |
[Spring] 패키지 구조 (0) | 2023.03.29 |