당니의 개발자 스토리
Hello JPA - 프로젝트 생성 본문
Hello JPA - 프로젝트 생성

이번 시간에는 jpa를 실제 프로젝트를 만들어 보고 마치 우리가 처음에 언어를 배우면 hello world로 하듯이, jpa에서의 hello world 프로젝트를 어떤 라이브러리를 받고 어떻게 세팅을 하는지 보여드리는 시간들을 가져 보겠습니다.

여기 목차 보시면 이제 처음에 프로젝트를 생성을 하고 그 다음에 실제 테이블 하나라도 가지고 동작하는 애플리케이션을 간단하게 만들어 보겠습니다.

먼저 프로젝트 생성하는 것을 해볼텐데요.

우선 이걸 하려면 JPA는 어쨌든 데이터베이스가 있어야 돌아가는 거잖아요. 그러니까 관계형 DB에 ORM 맵핑을 해서 돌아가는 것이기 때문에 데이터베이스가 있어야 됩니다. MySQL도 쓸 수 있고 Oracle 등등 여러가지를 쓸 수 있지만 저는 연습할 때는 H2 데이터베이스가 좋더라구요. 그래서 그걸로 일단 실습을 해보겠습니다.
h2database.com 사이트에 들어가시면,

여기서 다운로드 해가지고 본인의 플랫폼에 맞는 것을 받으시면 됩니다. 그리고 맥을 쓰시는 분들은 All 플랫폼으로 해서 받으시면 됩니다.
그러면 이걸 왜 쓰냐 하면 실습용 DB로는 제일 좋은 것 같아요.
조금 이따 보여드리겠지만 웹에서 콘솔 환경이 제공이 됩니다. 웹으로 바로 쿼리를 날려볼 수 있는 게 제공이 되고요. 용량도 되게 작고 라이브러리 자체가 되게 가벼워요. 그리고 아까 방금 말씀드린 웹 용 쿼리 툴이 제공이 되고 완벽하지는 않지만 MySQL이나 Oracle 쿼리랑 유사한 쿼리를 날려볼 수 있어요. 또 데이터베이스 시뮬레이션이 되고요. 그 다음에 이게 중요한데 데이터베이스에 따라서 어떤 애는 시퀀스, 어떤 애는 AUTO INCREMENT 이런 여러가지 방식을 지원하는데 h2 데이터베이스는 둘다 지원이 됩니다. 그리고 간단하게 메모리에서 db를 띄우지 않고 실행할 수도 있구요.
이전에 깔아놨던 분들은 깔고 바로 들어가시면 됩니다.



이 강의는 최근 프로젝트 경향에 맞춰서 pdf 파일로 따라가시는 게 더 좋아요.
저장한 설정을 눌러보시면 여러가지가 있는데,

우선은 그냥 이거를 서버 모드로 하면 실제 데이터베이스처럼 별도로 띄우는 겁니다.

비밀번호는 넘겨두고 사용자도 sa로 둔 다음 연결을 딱 하시면,

여기 뜨게 됩니다. 예를 들어서 select * from member 하고 쿼리를 날려보면, 지금 데이터가 없어서 그러는데 이게 데이터베이스 결과가 나오게 됩니다.









여기까지 H2 데이터베이스가 실행이 됐으면,

그 다음은 이제 Java 프로젝트를 만들 건데요. 요즘에는 다들 아시겠지만 Maven 이나 Gradle 같은 걸로 많이 써요, 저는 개인적으로 프로젝트를 할 때 Grade를 쓰는데 아무래도 아직까지는 Maven을 쓰시는 분들이 많으셔서 일단 이번 실습은 Maven으로 하려고 합니다.
Maven을 소개하자면, Java 라이브러리를 쓰고 빌드도 관리해주고 프로젝트 의존성 관리해주고 이런 애죠. 그래서 일단 프로젝트를 생성해 보겠습니다.

강의에서는 Java 8 이상을 쓰라고 했는데 최근에는 Java 17 이상을 써야하는 걸로 바꼈다.
그러면은 이제 Maven을 안 써보신 분들도 있어서 간단하게 말씀드리면,

여기 porm.xml 파일이라는 게 있습니다.

여기에는 이 프로젝트 groupId, artifactId 등이 있는데 사실 크게 중요하지는 않아요. 중요한 것은 라이브러리를 넣는 게 중요합니다.

External Library를 보시면 이미 우리가 다운받은 프로젝트에서 라이브러리를 땡겨왔습니다. 라이브러리는 porm.xml에서 dependency로 끌어오면 됩니다.

그래서 여기 보시면 <dependency> 부분이 있는데,

여기에 어떤 라이브를 쓸 거야 라고 넣어주시면 되는 건데요. 일단 Hibernate를 쓰시면 지금 현재 최신 버전이 뭐냐면 5.3.10.final 이라고 되어있는데, 우리가 다운받은 프로젝트에서는 6.4.2.Final로 되어있습니다.
hibernate.org에 들어가면,

여기 이제 Hibernate ORM 이라는 게 있구요. 여기 들어가 보시면

최근 릴리즈된 버전, 안정적인 마지막 버전이 6.5 라고 나오죠. 이 버전은 어떤 걸 기준으로 하면 되냐면, 결국 나중에는 우리가 스프링이랑 엮여서 실행을 해야 되거든요.

물론 jpa 단독으로도 충분히 애플리케이션을 개발할 수 있지만 뭐 스프링 프레임 효과랑 보통 통합을 한단 말이에요. 그러면 실무에서는 이런 라이브러리 버전을 선택할 때 어떻게 선택하는게 좋냐면,

스프링에서 프로젝트의 스프링 부트로 들어가신 다음에

내가 사용할 스프링 부트 버전을 딱 보고 여기 Reference Doc 가보시면,

org.hibernate 검색해보시면 스프링 부트 이 버전에서는 하이버네이트의 이 버전을 사용하는구나 라고 나와요.
그래서 스프링 부트에서 쓰는 거랑 궁합을 맞춰서 쓰려고 그랬습니다. 사실 지금은 스프링을 넣는 건 아니니까 크게 중요하진 않은데 참고차 말씀드렸구요.
그래서 Hibernate 같은 경우에 지금 라이브러리를 뭘 넣어야 되냐면,

groupId는 org.hibernate를 넣어야 됩니다. 그리고 artifactId는 hibernate-entity-manager를 넣어주시면 됩니다. 이걸 받으면 어떤 라이브러리들이 있냐면

지금 보시면 이렇게 필요한 의존성 연관된 라이브러리를 이만큼 땡겨옵니다.

이 중에서 핵심적인 건 여기 hibernate-core가 있고,

api 하고 버전이 4.0.0으로 나와있죠. 이게 뭐냐면 jpa는 인터페이스인데, 이 인터페이스의 구현체로 Hibernate를 선택을 했단 말이에요. 그러면 Hibernate가 그냥 JPA 인터페이스를 가지고 있는 거예요. 그래서 우리가 앞으로 사용하게 될 JPA 인터페이스들이 여기에 다 모아져 있습니다. 그래서 이거 하나를 당기시면 필요한 걸 다 당길 수 있습니다.

그 다음에 어쨌든 데이터베이스를 접근해야 되니까 데이터베이스를 접근할 수 있는 드라이버가 있어야 되겠죠.

저희는 h2 데이터베이스를 쓴다고 했으니까 h2 데이터베이스 이것도 Dependency를 걸었습니다.

그럼 이 라이브러리 버전은 중요한데요,

제가 방금 h2 데이터베이스에서 다운받은 버전이랑 꼭 같은 드라이버를 쓰셔야 됩니다.
그러면 이제 jpa 를 실제 한번 설정을 해보겠습니다.

설정한다는건 뭐냐면 이게 정말 Java 처럼 단순하게 hello world를 바로 칠 수 있는게 아니라, jpa를 띄우려면 이제 몇 가지 세팅 파일을 넣어 줘야 됩니다. 그 중에서 첫 번째가 jpa 설정 파일 이라는게 있는데요. 이게 이제 persistence.xml 파일을 만들어서 이 project에 넣어야 됩니다. 이 persistence.xml 파일이 들어갈 위치가 되게 중요한데요 표준 위치가 정해져 있어요.

여기에다가 넣으시면 됩니다.

강의 기준 상 여기 Persistence 버전 2.2 지금은 JPA 2.2를 쓰신다고 보시면 되구요. 그 다음에 몇 가지가 있는데, 이 JPA를 쓸 건데 네가 이름을 뭘 쓸 거야? 하는 거구요.

지금 저희 데이터베이스가 하나이기 때문에 그냥 Persistence Unit이라고 하고 이름은 Hello라고 지었구요.

여기서 필수 속성 이라는 게 있습니다. 어쨌든 jpa 같은 경우에 데이터베이스를 사용하잖아요. 그러면 데이터베이스 접근 정보를 넣어 줘야 됩니다.

여기 이렇게 javax-purchased-jdbc-driver 나는 h2 데이터베이스 드라이버를 써! 그게 아니라, 오라클 쓰면 오라클 드라이버 쓰시면 되구요.

그 다음에 user, name, password, 접근 url 적어 주시고 이게 지금 중요한데 localhost-test 라고 되어 있습니다.

그리고 Hibernate.Dialect 라는 게 있습니다. 이 부분이 되게 중요해서 잘 설명드리겠습니다.

데이터베이스 방언이라고 얘기하는데 JPA는 특정 데이터베이스에 종속적이지 않도록 설계가 되어 있어요. 예를 들어서 정말 극단적인 예제는 제가 MySQL을 쓰다가 Oracle 데이터베이스로 바꿔도 그냥 바꿔줘야 돼요. 근데 물론 뭐 되게 이론적인 부분이고 실무에서는 좀 손을 보긴 해야 돼요. 근데 아무튼 생각보다 잘 됩니다. 근데 그럼 왜 방언이라는 단어를 썼냐면 방언은 사투리라는 거죠. 이제 JPA는 특정 데이터베이스에 종속적이지 않도록 설계가 됐어요. 그래서 JPA에서 어떻게 했냐면 각각의 데이터베이스에서 뭔가 표준적이지 않은 거, DB 벤더마다 좀 다른 기능들은 방언이라고 표현했어요. 예를 들어 가변 문자 같은 게 있죠. SQL은 VARCHAR, 오라클은 VARCHAR2 다르죠. 문자를 자르는 함수도 SQL 표준은 SUBSTRING(), 즉 서브 스트링 이라는 게 있어요. 근데 오라클은 SUBSTR() 이런 식으로 바꿔 쓴단 말이에요. 그럼 이제 서로 안 맞는 문제가 있기 때문에 누군가가 맞춰줘야 합니다.
제일 거지 같은 거, 페이지 DB 바꾸면 페이징, 쿼리를 다 바꿔야 되거든요. 진짜 너무 힘들어요. MySQL은 limit를 쓰고 보통 Oracle은 row-num을 쓰는데요. 이것도 JPA의 입장에서 다 방언이라고 표현을 합니다. 방언은 SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능이라고 보시면 됩니다. 저 같은 경우에 h2 데이터베이스를 쓰잖아요.

그러면 '나는 지금 h2 데이터베이스라는 사투리를 써서 개발해' 라고 하면 jpa가 '너가 이걸 쓰니까 내가 알아서 번역해서 쓸게' 라고 한다고 보면 될 것 같습니다.
그래서 jpa가 Diarect라는 걸 쓰는데 여기 보면, mysql을 쓰시면 MySQLDiarect, Oracle는 OracleDialect, h2는 H2Diarect을 쓰시면 됩니다.
그래서 각각 속성이 있는데 예를 들어서 제가 여러분 많이 쓰시는 MySQL을 쓰면,

MySQL5direct 이런 걸 쓰시면 돼요. 요즘에는 좀 바뀌어서 inodb를 안 써도 됩니다.
그 다음에 oracle이면,

Oracle12cDialect를 쓰시면 됩니다.

우리는 Hibernate를 쓰는 거니까 다시 원상복구 해주고요.

Hibernate은 이제 40가지 이상의 데이터베이스 방어를 지원하는데요. 그러니까 거의 현업에서 쓸 수 있는 데이터베이스는 거의 다 방어를 있다고 보시면 돼요.

지금 보면 어떤 건 jakarta로 시작하고 어떤건 Hibernate로 시작하죠. 이게 뭐냐면 jakarta로 시작하는 건 제가 지난 시간에 설명드린 JPA 자체라는 게 표준이어서 구현체로 Hibernate도 있고 EclipseLink 라는 애도 있고 여러가지가 있다고 그랬죠. 그래서 jakarta 라는 것은 내가 이 Hibernate 라이브러리 말고 다른 jpa 구현 라이브러리를 써도 그대로 적용이 돼요. 근데 이건 표준을 지키는 거고요.

이건 Hibernate 에서만 쓰는 겁니다. 다른 라이브러리로 바꾸시면 이런 것을 다 바꿔야 됩니다. Hibernate 전용 옵션이라고 보시면 될 것 같습니다. 다른 데이터베이스도 Direct가 다 적용되는 게 있는데, 이름이 좀 달라요.
그리고 이런 옵션들은 제가 뒤에 설명 드릴께요. 간단하게 보면 자주 쓰는건 Hibernate.showSql이 있어요. 이건 뭐냐면 어떤 결국 DB에 쿼리가 나가는 거거든요. 그니까 쿼리 나가는 거 볼 거야, 말거야? 하는 옵션입니다.

자 그럼 이제 실제 애플리케이션 개발로 넘어가 보겠습니다.
'스프링 > 자바 ORM 표준 JPA 프로그래밍 - 기본편' 카테고리의 다른 글
| 영속성 컨텍스트 1 (0) | 2024.05.25 |
|---|---|
| Hello JPA - 애플리케이션 개발 (0) | 2024.05.25 |
| JPA 소개 (0) | 2024.05.24 |
| SQL 중심적인 개발의 문제점 (0) | 2024.05.24 |
| 강좌 소개 (0) | 2024.05.23 |