JAVA/JPA 학습기록

[Spring] JPA 기본편 환경세팅하면서 생겼던 시행착오

kth990303 2021. 4. 3. 14:22
반응형

이걸 My Diary (Java) 카테고리에 넣을지

Jpa_Basic 카테고리에 넣을지 굉장히 고민했는데, 어차피 블로그 자체가 내 일기니까 Jpa_basic에 넣기로 했다.

이후에 해결책을 알게 된다면 이글을 수정후 추가하도록 하겠다.


(21.04.03. 14:30 추가)

이 포스팅은 Gradle, Spring Boot로 설정하려다가 겪은 시행착오를 포스팅하는 글이다.

만약 강의 그대로 Maven으로 세팅해주고 Spring Boot 없이 순수한 환경에서 따라했는데도 에러가 난다?

그러면 Java JDK 11이 아니거나 pom.xml을 잘못 설정했을 확률이 높다.

 

아무래도 JPA 기본편이 가장 오래된 강의이다 보니 버전 충돌이 생겨서 pom.xml 문제가 좀 많은듯하다. 

JAVA JDK11인데 에러났을 경우 아래 글을 꼭 보자!

 

www.inflearn.com/questions/66109

 

Exception 오류 확인 요청 - 인프런 | 질문 & 답변

선생님께서 하신 것과 똑같이 하였는데, 아래와 같이 오류가 나는데 어디를 손봐야 할까요?  main 에서 아래 한줄만 딱 추가했습니다.  Persistence.createEntityManagerFactory('hello'); Exception in thr...

www.inflearn.com


스프링 기본편 강의를 거의 마쳐가는 상황이라

평소 jpa 공부 필요성을 많이 느끼고 있었어서 jpa 기본편을 수강해보기로 했다.

사실 이전에 활용편을 조금 듣다가, 이해 안가는 부분이 많아 jpa 기본편을 듣기로 결정한 것도 있다.

 

jpa 기본편은 스프링 핵심 원리 기본편보다 일찍 만들어진 강좌다.

그래서 그런지 gradle이 아닌 maven으로 환경설정을 해주는 모습이 보였다.

maven은 2학년 1학기 수업인 '오픈소스SW입문' 시간에 사용해봤던 경험이 있는데, 당시 maven에서 gradle로 옮겼을 때의 그 편함은 잊혀지지 않기도 했고, 이제 maven이랑 gradle을 둘 다 사용해본 경험이 있으므로 나는 gradle로 사용해서 해보기로 했다.

 

그리고 spring 환경세팅이 귀찮아서 spring boot를 사용해서 프로젝트를 생성했는데... 이게 나한테 걸림돌이 될 줄은 몰랐다. 시행착오를 포스팅해놔야겠다.

 

결론부터 말하자면, 아직 Spring Boot를 잘 다루는 상황이 아니라면 Maven 말고 Gradle을 사용하는 건 크게 상관없으나, Spring boot로 생성하지 말고 순수하게 스프링이 없는 환경에서부터 시작해보도록 하자.

www.inflearn.com/questions/27532

 

persistence-unit name 설정 문제 - 인프런 | 질문 & 답변

안녕하세요 김영한님!! 강의 열심히 수강중인 취업준비생입니다!! 제가 개발 설정을 스프링 부트 환경에서 gradle 과 application.yml을 사용해서 강의를 따라가고 있는데 application.yml에서 persistence-unit

www.inflearn.com



주의! 시행착오를 겪었던 환경세팅이므로 따라하지 마십시오!


Spring Initializer

spring boot를 이용해 프로젝트 생성해주는 모습

맨 처음에 난 프로젝트 생성을 하기 귀찮기도 했고,

스프링 환경이 있는 상황에서나, 없는 상황에서나 어차피 main을 통해 확인할 수 있는 건 똑같으므로

그냥 스프링부트를 통해 프로젝트를 생성해주었다.

 

생성자를 편하게 생성해주기 위해 lombok을,

hibernate와 jpa 기능을 이용해주기 위해 jpa를,

h2 database와 이후에 mysql로 바꿔서 이용해보기 위해 h2, mysql을 dependencies로 깔아주었다.

 

Build.Gradle

plugins {
	id 'org.springframework.boot' version '2.4.4'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'jpa-basic'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	runtimeOnly 'mysql:mysql-connector-java'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

그러면 위와 같이 build.gradle이 생성된다. 딱히 만질 건 없다.

빠른 로딩을 위해 '스프링 Inflearn' 강의에서 가르쳐주셨던 

ctrl + alt + s (preference)를 누르고 gradle에서 빌드를 gradle이 아닌 intelliJ IDEA에서 실행되도록 변경해주었다.

lombok을 사용하기 위해 Annotation Processors를 검색하고, 상단의 Enable annotation processing에 체크를 해주고 OK를 눌러주었다.

 

Application.properties

 

spring.datasouce.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

#jpa
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true
spring.jpa.show-sql=true
spring.jpa.database=h2
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

#logging
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate.sql=DEBUG
logging.level.jpa=DEBUG

이 부분은 아래 블로그를 참고하였다.

마침 내가 원했던 JPA + Gradle + SpringBoot 환경설정이었다.

 

내가 실력이 좀 더 있었다면 굉장히 유용한 블로그 글이었겠지만...

아직 저 포스팅을 참고하기 위해선 실력을 더 키워야 했었다...

 

m.blog.naver.com/kangminser88/221308016222

 

[Spring Boot+JPA+thymeleaf+Gradle] JPA 설정

지난 시간까지 Spring Boot 프로젝트 생성 Thymeleaf 를 설정하였습니다. 오늘은 DB를 연결하여 thyme...

blog.naver.com


자, 환경설정을 다 맞춰보았다.

이제 아래 코드를 실행해보자.

 

JpaMain.java

package hellojpa;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        emf.createEntityManager();
    }
}

No persistence provider for entitymanage named hello...

보기 좋게 에러가 뜬다.

물론, 실제 강의에서도 이 코드는 에러가 뜨지만, 강의에서 의도한 에러가 뜨는 것이 아닌,

아예 EntityManager name을 찾지 못하는 에러가 뜬 경우인 것이다...

 

물론 아래와 같은 방안을 시도해보았다.

  1. Application.properties에 persistence-unit.name="hello" 을 추가
  2. Application.properties를 Persistence.xml로 refactor 후 시도

당연히 둘 다 결과는 여전했다.

그래서 인프런 질문을 찾아보았다.

 

나처럼 maven으로 하지 않고 gradle로 하고, 스프링부트를 이용해서 환경세팅에 성공한 사람이 분명 있을 것이다 ! 싶어서말이다.

 

성공한 사람은 찾지 못했지만, 나랑 비슷한 상황의 질문글을 찾았다!

www.inflearn.com/questions/27532

 

persistence-unit name 설정 문제 - 인프런 | 질문 & 답변

안녕하세요 김영한님!! 강의 열심히 수강중인 취업준비생입니다!! 제가 개발 설정을 스프링 부트 환경에서 gradle 과 application.yml을 사용해서 강의를 따라가고 있는데 application.yml에서 persistence-unit

www.inflearn.com


오... 

그냥 스프링 없는 환경에서 하자 ^^

 

그리고 그냥 maven 안한지도 오래됐고...

기본편 말고 활용편에선 gradle 쓴데니까 이번엔 그냥 maven 쓰면서 따라가려고 한다.

 

난 환경세팅을 배우러 온 게 아니고 jpa 배우러 온거니까 그냥 강의 그대로 세팅은 따라가려고 한다.

반응형