
앞으로 JPA와 관련해서 필자가 공부했던 내용을 올린다고 했지?
아직 전공서적을 못 정했기 때문에 필자가 나름대로 공부한 내용을 정리해서 올리겠다.
그래도 근본 없이 배운 것은 아니기 때문에 내용에서 의심할 여지는 없을 것이다.
그럼 잡담은 집어 치우고 바로 시작해보자.
1. JPA vs SQL
CREATE TABLE IF NOT EXISTS courses (
id bigint(5) NOT NULL AUTO_INCREMENT,
title varchar(255) NOT NULL,
tutor varchar(255) NOT NULL,
PRIMARY KEY (id)
);
@NoArgsConstructor
// 기본생성자를 대신 생성해줍니다.
@Entity
// 테이블임을 나타냅니다.
// CREATE TABLE IF NOT EXISTS courses ();
public class Course {
// This Class represents table in DB server.
@Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
@GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
private Long id;
@Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
private String title;
@Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
private String tutor;
public String getTitle() {
return this.title;
}
public String getTutor() {
return this.tutor;
}
public Course(String title, String tutor) {
this.title = title;
this.tutor = tutor;
}
}
결론부터 박아놓고 시작하겠다.
위에 놈은 SQL이라고 하고
아래 놈은 JPA.. 가 아니라 그 녀석을 사용하기 위해 준비한 선행코드이다.
아직까지는 스프링에서 흔히 사용하는 롬복을 이용해서 만든 100% 자바코드이지.
하지만 위, 아래는 구조적으로 100% 동일한 코드이다.
문법만 다를 뿐이지 컴파일 돌려보면 똑같은 결과물이 출력된다 이거다.
여러분의 이해를 위해 비유를 하나 들어보겠다.
Hello!
Bongjour!
你好!
こんにちは。
hola!
...
이 녀석들의 공통점이 뭘까?
단순하게 생각해라.
나라별, 민족별, 문화별, 인종별로 쓰는 언어는 다르지만!
뜻은 '안녕하세요!' 한 가지로 통하기 마련이다.
SQL과 JSP의 관계 역시 마찬가지이다.
필자가 이전에 이클립스를 쓰면서 가장 불편했던 점이 그거다.
자바 쓰다가 SQL 쓰고.. SQL 쓰다가 다시 자바 쓰고..
적성하는 본인도 헷갈릴 뿐더러, 코드의 가독성부터 확 떨어진다.
try{
conn = ds.getConnection();
String sql = "SELECT num, name, password, subject, content, write_date, write_time, ref, step, lev, read_cnt, child_cnt";
sql += " FROM BOARD ORDER BY ref desc, step asc ";
sql += " LIMIT ? , ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, WRITING_PER_PAGE * (Integer.parseInt(curPage) -1));
pstmt.setInt(2, WRITING_PER_PAGE);
rs = pstmt.executeQuery();
(생략..)
}catch{
}finally{
}
이딴식으로 말이다..
저게 뭐 어때서?? 하는 분들도 있겠지만
필자는 무언가 모호하다라는 것을 알려주는 노란 줄만 떠도 경기를 일으킨다.
내가 작성한 코드이지만 벌써부터 읽기 싫어져..
JPA는 그것을 상당 부분 잡아준다.
문법은 100% 자바 언어이지만 프로젝트를 생성할 때 JPA 라이브러리를 임포트 했기 때문에..
DB 서버에서도 알아먹을 수 있게씀 자동으로 SQL문으로 변환해준다.
코드의 가독성이 비약적으로 상승하겠지?
2. Repository (저장소)
package com.sparta.week02.domain;
// This Package contains table
import org.springframework.data.jpa.repository.JpaRepository;
public interface CourseRepository extends JpaRepository<Course, Long> {
// This Class represents SQL in DB server.
// Parent Class: Course.java
// Data type of id is Long.
// JpaRepository can be used only in Interface.
// Interface only contains methods without member variable.
}
요 놈은 또 어디에 쓰이는 물건인고?
위와 마찬가지로 JPA를 사용하기 위해 준비한 선행코드 중에 하나이다.
그냥 상속이라는 명목으로 여기저기에서 공중변소처럼 불려 다니는 녀석이라는 것 정도만 알아둬라.
우리는 지금 JPA를 공부하고 있기 때문에 Java 문법을 너무 깊게 파고들어갈 수는 없다.
이 녀석의 기능 부분에만 주목하고 넘어가도록 하자.
필자가 제목에서도 적어놨듯이 Repository는 저장소같은 개념이다.
Git 저장소는 들어봤을 것 아닌가?
더 쉽게 비유하자면 스타에서 인구 수 채워주는 Supply Depot같은 느낌?
위에서 살펴봤던 Course.java 클래스에 없는 기능들을 보조해주기 위한 녀석이다.
대표적으로 Course 클래스에는 @Setter가 없었지?
하지만 요 너석은 JpaRepository<>를 상속하고 있기 때문에, 똑똑한 스프링 선생께서 알아서 꺼내다가 쓸 것이다.
특히 배열 리스트 안에는 Course.java 클래스의 멤벼변수인 Long타입의 ID 값이 들어가 있기 때문에
도메인 (Course.java)에서 요청한 SQL문을 자동으로 번역하여 DB서버에 전달해 줄 수 있는 것이다.
이게 굳이 필요한가? 할 수도 있는데 약방의 감초같은 녀석을 쓰지 않을 이유가 없지.
우리는 지금 자바에서 최대한 SQL문을 쓰지 않기 위해 JPA를 공부하고 있는 것이다.
앞으로도 필자와 함께 이 JPA에 더욱 친숙해져보자.
MyBatis도 동일한 기능을 수행할 수 있지만, JPA가 좀 더 최신기술이다.
'[JAVA] > JPA' 카테고리의 다른 글
5. JPA Advanced [Part.02] (0) | 2022.07.28 |
---|---|
4. JPA Advanced [Part.01] (0) | 2022.07.27 |
3. Why JPA? (0) | 2022.07.25 |
2. JPA Basic (0) | 2022.07.23 |
0. Intro (0) | 2022.07.21 |