이번주는 jpa 활용 강의를 시작하였습니다..만… 프로젝트를 만들다가 화딱지가 나서 일단 섹션 1인 프로젝트 환경설정까지 했습니다.
프로젝트 생성
start.spring.io로 접속하면 매우 쉽게 프로젝트를 만들 수 있다.
이렇게 라이브러리를 설정해주고 generate 후 intellij로 프로젝트를 빌드하면 된다.
그리고 Preference → plugin으로 가서 lombok을 검색, 실행하여 롬복을 적용시킨다.
View 환경설정
thymeleaf 라이브러리를 설치했기 때문에 서버사이드 렌더링을 해서 resources 경로에 templates나 static 폴더에 html 파일을 넣고 컨트롤러에서 매핑을 해주게 되면 스프링부트가 html을 반환하게 된다.
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
}
컨트롤러에 다음과 같이 경로를 리턴하게 만들면
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
</body>
</html>
resources/templates/hello.html 경로로 향하여 이렇게 작성해둔 html을 반환한다.
h2 설치 및 jpa 설정, 확인
h2 드라이버를 설치하고 h2.sh를 실행시킨 뒤 다음 과정으로 데이터베이스를 생성한다.
- jdbc:h2:~/jpashop (최소 한 번)
- ~/jpashop.mv.db 생성 확인
- 이후에는 jdbc:h2:tcp://localhost/~/jpashop 로 접속
이후에는 application.yml을 아래처럼 설정해준다.
# yml 파일은 띄어쓰기 2칸으로 계층을 만들어서 이를 잘 지켜야함
spring:
datasource: # spring.datasource가 된다
url: jdbc:h2:tcp://localhost/~/jpashop
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create # 애플리케이션 실행 시점에 테이블을 drop & create
properties:
hibernate:
# show_sql: true # hibernate 실행 SQL을 sout 함
format_sql: true
logging.level:
org.hibernate.SQL: debug # logger로 hibernate 실행 SQL을 남긴다
org.hibernate.orm.jdbc.bind: trace
여기까지 하면 설정은 완료됐다. jpa와 h2의 연결이 제대로 됐는지 확인하기 위해 아래 과정을 진행한다.
package jpabook.jpashop;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.Setter;
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
private Long id;
private String userName;
}
엔티티를 생성하고
package jpabook.jpashop;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
@Repository
public class MemberRepository {
@PersistenceContext
EntityManager em;
public Long save(Member member) {
em.persist(member);
return member.getId();
}
public Member find(Long id) {
return em.find(Member.class, id);
}
}
리포지토리로 save와 find를 구현한다.
package jpabook.jpashop;
import jakarta.transaction.Transactional;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
@SpringBootTest
class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Test
@Transactional
@Rollback(false)
public void testMEmber() {
//given
Member member = new Member();
member.setUserName("memberA");
//when
Long savedId = memberRepository.save(member);
Member findMember = memberRepository.find(savedId);
//then
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); // id가 같은지
Assertions.assertThat(findMember.getUserName()).isEqualTo(member.getUserName()); // name 속성이 같은지
Assertions.assertThat(findMember).isEqualTo(member); // jpa 엔티티 동일성
}
}
그리고 테스트 코드를 작성한다.
실행을 해보면 오류가 안나야 하고, h2 콘솔로 데이터베이스를 확인하면 member 테이블과생성한 객체가 저장되는 것을 확인할 수.. 있어야…하는데….
근데 왜 계속 메모리 모드로 될까요.. 얘 때문에 머리가 아파서 죽겟습니다… 일단 여기를 해결해야 넘어갈 수 잇을 거 같은데 도무지 이유를 모르겠습니다.. 이후에도 이걸 해결하는 데 시간을 많이 써야할 거 같기도 하고..합니다.....
+) 메모리모드로 실행된 데이터베이스에 접속하면 테이블을 확인할 수는 있었습니다.
애플리케이션을 실행시키고 로그를 살펴보는데, url을 h2-console로 접속하면, 메모리모드로 실행한 h2 데이터베이스에 접속할 수 있다라고 하는 거 같아서 localhost:8080/h2-console로 접속을 해서 저 데이터베이스 url로 h2 콘솔에 입력해서 접속하니 테이블을 확인할 수 있었다.
@Rollback(false)를 하고 테스트의 결과를 확인하려면 제대로 해결 해야겠지만.. 애플리케이션 실행했을 때의 데이터베이스는 확인할 수 있으니 일단 0.2정도 안심했습니다...
++) application.yml을 application.properties로 수정해서 했더니 성공했습니다.........
'WINK-(Web & App) > Spring Boot 스터디' 카테고리의 다른 글
[2025 1학기 스프링부트 스터디] 최비성 #2주차 (0) | 2025.04.09 |
---|---|
[2025 1학기 스프링부트 스터디] 장민주 #3주차 (0) | 2025.04.08 |
[2025 1학기 스프링 부트 스터디] 석준환 #3주차 (0) | 2025.04.08 |
[2025 1학기 스프링부트 스터디] 여민호 #3주차 (0) | 2025.04.08 |
[2025 1학기 스프링부트 스터디] 이종윤 #2주차 (0) | 2025.04.07 |