본문 바로가기

개발/JPA

[강의 요약 노트]실전! 스프링 부트와 JPA 활용1 : (1) 프로젝트 환경 설정

강좌 소개

<1편> 웹 애플리케이션 개발

1. 프로젝트 세팅

2. 회원, 주문, 상품의 요구 사항 분석 

3. 도메인 모델 설계

4. 엔티티 설계

5. 애플리케이션 아키텍처 구성

6. 핵심 비즈니스 로직 개발

- 회원, 상품, 주문 도메인 개발

- 핵심 비즈니스 로직 개발

- 테스트 케이스 검증

- 도메인 주도 설계 이해

7. 웹 계층 개발

 

<2편> API 개발과 성능 최적화 

REST API 개발

- 등록,수정, 조회 REST API 개발

- API 개발 실무 노하우

성능 최적화

- JPA 극한의 조회 성능 최적화 노하우 전수

- 복잡한 예제를 6단계로 성능 튜닝

- 실무 JPA 성능 문제의 90% 해결

 

1편 강좌의 장점

웹 애플리케이션 개발의 전체 사이클을 볼 수 있다. 

 

프로젝트 생성

세팅

의존 관계: Spring Web / Thymeleaf / Spring Data JPA / H2 / Lombok

 

프로젝트 다운로드 

 

프로젝트 import 방법

build.gradle 파일을 import

 

build.gradle 파일

//파일: build.gradle
plugins {
	id 'org.springframework.boot' version '2.6.2'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

// 롬복의 애노테이션을 관리하기 위한 설정
configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

스프링부트의 편리한 점:

org.springframework.boot의 버전을 업그레이드하면, 관련 라이브러리의 버전도 함께 자동으로 올라감. 

 

라이브러리 살펴보기 

주요 라이브러리

** 로깅 라이브러리: starter는 logging을 포함.

logging은 slf4j를 사용하며, 이는 logback, log4j 등 다양한 구현체와 연결 가능하다. 

(slf4j와 logback 연결해서 쓰는 것이 요즘 대세)

 

**  Spring core와 context도 starter에서 포함. 

 

참고: 터미널에서 라이브러리 확인하기 위해 사용하는 명령어

스프링 데이터 JPA는 스프링과 JPA를 먼저 이해하고 사용해야하는 기술이다!

 

VIEW 환경 설정

thymeleaf를 사용

 

장점

Natural markup

: 마크업의 구조를 깨지않고 그대로 사용가능하다.

cf) JSP의 경우 if문 안에 html 태그가 별도로 들어가서, 퍼블리싱 원본의 구조를 그대로 유지하기 어렵다. 

 

스프링부트 thymeleaf가 viewName을 매핑하는 방법

resources: template/ + {viewName} + .html

 

정적 view & 동적 view

정적: resources/static 하위 

동적: resources/templates 하위 

 

template HotSwap가능하도록 하는 방법

build.gradle의 디펜던시 추가

implementation 'org.springframework.boot:spring-boot-devtools'

TODO: 리컴파일 가능하도록 위 디펜던시 설정 완료하기. 

(강의에서는 위내용만 추가하는데 나는 안됨...흑)

 

h2 생성

 

처음 DB 인스턴스 생성시 JDBC URL

jdbc:h2:~/jpashop

이후 재접속시  JDBC URL

jdbc:h2:tcp://localhost/~/jpashop

 

JPA와 DB 설정, 동작확인

public class MemberRepository {

    @PersistenceContext
    private EntityManager em;

    public Long save(Member member) {
        em.persist(member);
        return member.getId();
    }
}

-> save 함수에서 member 대신 member의 id를 분리하는 이유: 커멘드와 쿼리를 분리한다 원칙을 따름 (CQRS. Command and Query Responsibility Segragation)

 

** JPA와 DB 설정, 동작확인 => 10:58 이후 다시 재시청 필요