💡 본 게시글은 김영한님의 인프런(Inflearn) 강의 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발에 대해 공부하고, 정리한 내용입니다.
1. 프로젝트 환경설정 및 초기 세팅
1) 프로젝트 생성
(1) 필수 설정
- Project: Gradle Project
- Language: Java
- Spring Boot: 2.4.x
- Packaging: Jar
- Java Version: 11
(2) 의존성 설정
- Spring Web: 웹 애플리케이션 개발을 위한 라이브러리로, HTTP 기반의 웹 애플리케이션을 쉽게 만들 수 있도록 지원합니다.
- Thymeleaf: 서버사이드 템플릿 엔진(View)으로 HTML 파일을 서버 측에서 렌더링합니다.
- Spring Data JPA: JPA(Java Persistence API)와의 통합을 쉽게 해주는 라이브러리로, 객체와 관계형 데이터베이스 간의 매핑을 쉽게 해줍니다.
- H2: 인메모리 데이터베이스로, 개발 단계에서의 테스트와 프로토타입 작업에 적합합니다.
- Lombok: 반복되는 코드를 줄여주는 라이브러리로, getter, setter, toString 등을 자동으로 생성해줍니다.
- Validation: 데이터 검증을 위한 라이브러리로, 입력 데이터에 대한 유효성을 검사할 때 유용합니다.
2) 라이브러리 및 의존관계 살펴보기
(1) Gradle 의존관계 확인 방법
- 명령어 사용:위 명령어를 사용하면 프로젝트에 사용된 모든 라이브러리와 의존성을 확인할 수 있습니다.
./gradlew dependencies --configuration compileClasspath- IntelliJ 사용:
- Gradle 탭: IntelliJ의 오른쪽에 있는 Gradle 탭을 클릭하면, 'Dependencies' 섹션에서 현재 프로젝트에 추가된 모든 라이브러리와 의존성을 확인할 수 있습니다.
(2) 스프링 부트 관련 라이브러리
- spring-boot-starter-web: 웹 애플리케이션을 개발하기 위한 기본적인 의존성입니다. 이를 통해 웹 서버를 구축하고 HTTP 요청과 응답을 처리할 수 있습니다.
- spring-boot-starter-tomcat: 내장 톰캣 서버로,
spring-boot-starter-web에 포함되어 있습니다. 별도의 WAS(Web Application Server)를 설치할 필요 없이, 프로젝트 실행만으로 톰캣 서버가 구동됩니다. - spring-webmvc: 스프링 MVC 프레임워크로, MVC(Model-View-Controller) 패턴을 쉽게 구현할 수 있도록 도와줍니다.
- spring-boot-starter-thymeleaf: Thymeleaf 템플릿 엔진을 위한 의존성입니다. 서버 측에서 HTML 파일을 렌더링하는 데 사용됩니다.
- spring-boot-starter-data-jpa: JPA와 스프링 데이터(Spring Data)를 통합하여, 데이터베이스 작업을 보다 쉽게 할 수 있도록 지원합니다.
- spring-boot-starter-aop: 스프링 AOP(Aspect-Oriented Programming) 관련 라이브러리로, 관점 지향 프로그래밍을 지원합니다.
- spring-boot-starter-jdbc: 스프링 JDBC 관련 라이브러리로, 데이터베이스와의 직접적인 통신을 지원합니다.
- HikariCP: 커넥션 풀 라이브러리로, 스프링 부트 2.0 이상에서 기본 설정으로 사용됩니다. 커넥션 풀의 성능과 안정성이 매우 뛰어납니다.
- hibernate + JPA: Hibernate는 JPA(Java Persistence API)의 구현체로, 객체와 관계형 데이터베이스 간의 매핑을 제공합니다.
- spring-boot-starter: 스프링 부트의 기본 라이브러리입니다. 스프링 프레임워크 코어 및 로깅 기능을 제공합니다.
- spring-core: 스프링 코어 라이브러리로, 스프링의 핵심 기능들을 제공합니다.
- spring-boot-starter-logging: 로깅 관련 라이브러리로, SLF4J와 Logback을 기본으로 사용합니다.
3) 테스트 라이브러리
(1) 주요 테스트 라이브러리 구성
- spring-boot-starter-test: 테스트에 필요한 통합 라이브러리입니다. 여러 개의 라이브러리들이 이 의존성에 포함되어 있습니다.
- JUnit: 자바 기반의 테스트 프레임워크로, 단위 테스트를 쉽게 작성할 수 있습니다.
- Mockito: 목(mock) 객체를 만들기 위한 라이브러리로, 테스트를 위한 객체를 쉽게 생성할 수 있습니다.
- AssertJ: 테스트 코드 작성 도우미 라이브러리로, 가독성이 좋은 테스트 코드를 작성할 수 있습니다.
- spring-test: 스프링 통합 테스트 지원 라이브러리로, 스프링 컨텍스트 내에서 테스트를 수행할 수 있도록 도와줍니다.
4) 기타 라이브러리
- H2 데이터베이스: 테스트와 개발 환경에서 사용할 수 있는 가벼운 인메모리 데이터베이스입니다. 메모리에 로드되기 때문에, 빠르고 설정이 간편합니다.
- Connection Pool: 기본적으로 HikariCP를 사용하며, 커넥션 풀링을 통해 데이터베이스 연결의 효율성을 극대화합니다.
- Logging: SLF4J와 LogBack을 사용하여, 로그를 출력하고 관리합니다. 운영 환경에서의 모니터링과 디버깅에 필수적입니다.
2. View 환경 설정
1) Thymeleaf 템플릿 엔진
(1) 공식 문서 및 자료
- Thymeleaf 공식 사이트: Thymeleaf
- 스프링 공식 튜토리얼: Serving Web Content
- 스프링 부트 메뉴얼: Spring Boot Developing Web Applications
(2) View 파일 위치 설정
- View 파일 기본 경로:
resources/templates/ + {ViewName} + .html- 스프링 부트에서 기본적으로 설정된 템플릿 파일 경로는
resources/templates/입니다. 뷰 파일은 이 디렉토리 안에 위치해야 하며, HTML 파일명은Controller에서 반환하는 뷰 이름과 일치해야 합니다.
- 스프링 부트에서 기본적으로 설정된 템플릿 파일 경로는
(3) 컨트롤러 예시 코드
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
}
}
- 위 예시에서
HelloController는"/hello"요청을 처리합니다. 모델에 데이터를 추가하고, "hello" 뷰를 반환하여resources/templates/hello.html파일이 렌더링되도록 합니다.
(4) 템플릿 동작 확인 (hello.html)
<!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>
- 위의
hello.html파일은Controller에서 전달된 데이터data를 사용하여 "안녕하세요. hello!!"를 출력합니다.
(5) spring-boot-devtools 사용
- spring-boot-devtools: 개발 시 매우 유용한 라이브러리로, HTML 파일을 수정한 후 서버를 재시작할 필요 없이 변경 사항이 자동으로 반영됩니다. 이를 위해 IntelliJ에서
Build->Recompile을 사용하여 변경된 HTML 파일을 컴파일합니다.
3. H2 데이터베이스 설치 및 설정
1) 설치 및 설정
(1) H2 데이터베이스 설치
- 공식 사이트: H2 Database
- 데이터베이스 파일 생성:
jdbc:h2:~/jpashop- 이 명령을 통해
~/jpashop.mv.db파일이 생성됩니다.
- 이 명령을 통해
(2) 데이터베이스
서버 실행 및 접속
- 서버 접속 방법:
jdbc:h2:tcp://localhost/~/jpashop- 기본적으로 H2 데이터베이스는 메모리 모드로 실행되며, 로컬 파일에 데이터를 저장할 수 있습니다.
(3) MVCC 옵션 주의 사항
- H2 데이터베이스의 MVCC 옵션은 1.4.198 버전부터 제거되었습니다. 따라서 1.4.200 버전에서는 MVCC 옵션을 사용할 경우 오류가 발생할 수 있습니다.
2) JPA와 DB 설정 및 동작 확인
(1) application.yml 설정
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashop
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
# show_sql: true
format_sql: true
logging:
level:
org.hibernate.SQL: debug
# org.hibernate.type: trace
- 설정 설명:
spring.datasource.url: H2 데이터베이스 URL을 지정합니다.spring.jpa.hibernate.ddl-auto: 애플리케이션 실행 시점에 테이블을 drop 하고 다시 생성합니다.logging.level.org.hibernate.SQL: SQL 실행 로그를 디버그 레벨로 설정하여 쿼리 로그를 확인할 수 있습니다.
(2) 주의사항
- YAML 파일의 계층 구조는 띄어쓰기 2칸으로 유지해야 하며, 잘못된 띄어쓰기나 들여쓰기는 오류를 발생시킬 수 있습니다.
(3) 엔티티 및 리포지토리 동작 확인
- Member 엔티티 코드:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
// Getter and Setter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
- MemberRepository 코드:
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
@Repository
public class MemberRepository {
@PersistenceContext
private EntityManager em;
public Long save(Member member) {
em.persist(member);
return member.getId();
}
public Member find(Long id) {
return em.find(Member.class, id);
}
}
- 테스트 코드:
import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.test.annotation.Rollback;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest
public 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
assertThat(findMember.getId()).isEqualTo(member.getId());
assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
assertThat(findMember).isEqualTo(member); // JPA 엔티티 동일성 보장
}
}
(4) 빌드 및 실행
- 명령어:
./gradlew.bat build - 실행 파일 경로:
cd build/libs java -jar jpashop-0.0.1-SNAPSHOT.jar
(5) JUnit5 테스트 설정
build.gradle마지막에 다음 코드 추가:
test {
useJUnitPlatform()
}
4. 쿼리 파라미터 로그 남기기
1) 로그 설정
- org.hibernate.type: SQL 실행 파라미터를 로그로 남깁니다. 이를 통해 쿼리 실행 시 전달되는 파라미터를 확인할 수 있습니다.
2) 외부 라이브러리 사용
- 라이브러리:
p6spy-spring-boot-starter- Maven 의존성:
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
5. 총 정리: 이해해야 할 개념들
- 프로젝트 설정의 중요성: 프로젝트 생성 시 필요한 구성 요소들과 라이브러리를 정확히 이해하고 설정해야 원활한 개발이 가능함.
- 스프링 부트와의 통합: 스프링 부트는 여러 복잡한 설정들을 자동화해주며, 이를 통해 개발자는 비즈니스 로직에 집중할 수 있음.
- Thymeleaf 템플릿 엔진: 서버 사이드 렌더링을 지원하는 강력한 템플릿 엔진으로, 뷰 파일 작성과 데이터 바인딩에 능숙해야 함.
- H2 데이터베이스와 JPA 설정: 테스트 및 개발 환경에서 가볍고 유용한 H2 데이터베이스와 JPA 설정의 기본 개념과 실습 방법.
- 테스트 주도 개발(TDD): JUnit과 Mockito를 사용한 테스트 주도 개발의 중요성 및 코드 작성 방법.
- 로깅과 모니터링: Hibernate와 같은 ORM 툴의 SQL 로그와 쿼리 파라미터 로그를 효과적으로 관리하는 방법.
'Spring > 웹 애플리케이션 개발' 카테고리의 다른 글
| 06. 주문 도메인 개발 (0) | 2024.09.08 |
|---|---|
| 05. 상품 도메인 개발 (0) | 2024.09.08 |
| 04. 회원 도메인 개발 (0) | 2024.09.08 |
| 03. 애플리케이션 구현 준비 (2) | 2024.09.08 |
| 02. 도메인 분석 설계 (2) | 2024.09.08 |