'프로젝트 환경설정' 목차 

1. 프로젝트 생성

2. 라이브러리 살펴보기 

3. view 환경설정  

4. H2데이터베이스 설치  (이번 포스팅)

5. JPA와 DB설정, 동작확인 

참고) 쿼리 파라미터 로그 남기기 


H2 데이터베이스 설치

1) 1.4.200 버전 설치를 권장한다.

윈도우, 맥 둘 다 지원한다. 경량의 교육용 DB다. H2 공식 홈페이지에서 다운로드 받고 설치한다. 

 

2) h2 설치 경로의 bin 디렉토리 하위에 가면 h2.sh 가 있다. 

3) ./h2.sh 로 실행하면, H2 콘솔 웹페이지가 열린다. 

데이터베이스 이름을 minishop 으로 설정하고 '연결'을 클릭한다. 

 

4) 홈디렉토리에 아래와 같이 db 파일이 생성된 것을 확인할 수 있다. 

5) 이제 minishop DB 웹콘솔에 접속할 때 tcp 네트워크 모드로 jdbc:h2:tcp://localhost/~/minishop 접속할 수 있다. 


JPA와 DB설정, 동작확인

1) properate 보다는 가독성 좋은 yml (야믈) 로 설정파일을 만들자. 

DB커넥션, jpa, 로깅에 대한 설정을 작성한다. 

 

yml은 띄어쓰기 2개를 통해 계층을 구분한다. 2개 띄는 것을 틀리지 않도록 주의하자. 

spring: # 띄어쓰기 없음
  datasource: # 띄어쓰기 2개
  url: jdbc:h2:tcp://localhost/~/minishop
  username: sa
  password:
  driver-class-name: org.h2.Driver

  jpa: # 띄어쓰기 2개
    hibernate:
      ddl-auto: create # 애플리케이션 실행 시점에 테이블을 drop하고 다시 생성한다
    properties:
      hibernate:
        format_sql: true

logging: # 띄어쓰기 없음
  level: # 띄어쓰기 2개
    org.hibernate.SQL: debug # 로거를 통해 하이버네이트 실행 SQL을 남긴다

2)  jpa.hibernate.ddl-auto 옵션이 중요하다. 

create 는 애플리케이션 실행 시점에 테이블을 drop 하고 다시 create한다. 

none 은 ddl을 실행하지 않는다. 운영에서는 반드시 none 으로 해야한다. 

 

3) 모든 로그 출력은 System.out 이 아니라 가급적 로거를 통해 남기자. 

jpa.properties.hibernamte.show_sql 옵션은 표준 출력에 하이버네이트 실행 sql을 남긴다.

logging.level.org.hibernate.SQL 옵션은 로거를 통해 하이버네이트 실행 sql을 남긴다.


참고: 쿼리 파라미터 로그 남기기

 

* logging.level.org.hibernate.type: trace 옵션이 있지만, 보기에 편하지는 않다. 외부 라이브러리 P6Spy를 이용하자.

 

* 쿼리 파라미터 로그 라이브러리 - decorator github

아래 의존성을 build.gradle 에 넣자. 최신 버전을 적어주자. 

implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0'

insert 쿼리의 파라미터가 그대로 들어가는 것이 보인다. 

로그 출력은 개발 중에는 상관 없지만, 운영에서는 로그 출력이 부하가 될 수도 있다. 

따라서 성능 테스트를 반드시 해 보고, 로그 레벨을 조정해야 한다. 


다음 시간에는 도메인 분석 설계를 한다. 

공부 자료 출처: 스프링부트와 JPA활용1

 

 

728x90

'프로그래밍 > JPA' 카테고리의 다른 글

view 환경 설정  (0) 2022.01.10
프로젝트 생성  (0) 2022.01.10
스프링 부트와 JPA활용1 - 개요 및 목차  (0) 2022.01.10
JPA 다대일 단방향 양방향  (0) 2021.07.03
연관관계 매핑시 고려할 3가지  (0) 2021.07.03

'프로젝트 환경설정' 목차 

1. 프로젝트 생성

2. 라이브러리 살펴보기 

3. view 환경설정  (이번 포스팅)

4. H2데이터베이스 설치 

5. JPA와 DB설정, 동작확인 


view 환경설정 

템플릿 엔진으로 Thymeleaf (타임리프)를 선택했다.

주로 스프링이 권장하는 템플릿 엔진으로는 타임리프, 머스타치 등이 있다.

html 를 변경하지 않고, html 마크업 내에 타임리프 코드가 들어간다는 것이 장점이다. 3.x 버전 대에 와서 쓸만해 졌다.

* 타임리프 공식 사이트 https://www.thymeleaf.org/

* 스프링 공식 튜토리얼: https://spring.io/guides/gs/serving-web-content/

수많은 튜토리얼이 있으니까 필요한 기능을 구현하기 전에 참고하면 도움된다. 

 

1. 서버사이드 랜더링한 hello.html 페이지 띄우기 

 

타임리프의 viewName 기본 매핑

resources: templates/ + {viewName} + .html 

스프링부트가 타임리프의 viewName을 매핑해주는 것이다.

아래는 hello.html 이다. 

경로는 resource/templates/hello.html 이다. 

 

Controller 의 return에 viewName만 넘겨주면 html이 랜더링된다. 

Model에 속성 여러개를 담아서 view에 넘길 수 있다. 

속성 이름: "data", 속성 값: "hello!!"

 

2. 랜더링 안하고 정적인 페이지를 뿌리는 경우 

static 디렉토리 하위에 페이지를 만든다. 


참고 : 재시작 없이 View 파일 변경하기 

spring-boot-devtools 라이브러리를 추가하기

html 파일을 컴파일만 해주면, 서버 재시작 없이 view파일 변경이 가능하다. 

intelliJ 컴파일 방법 : 메뉴 build -> Recompile 


공부 자료 출처: 스프링부트와 JPA활용1

 

728x90

'백문이 불여일타'니까 강의를 들으면서 프로젝트를 만든다. 

'프로젝트 환경설정' 목차 

1. 프로젝트 생성 (이번 포스팅)

2. 라이브러리 살펴보기 

3. view 환경설정 

4. H2데이터베이스 설치 

5. JPA와 DB설정, 동작확인 


프로젝트 생성 

간단한 회원 조회, 상품 조회, 주문, 주문 조회 기능을 갖춘 프로젝트를 만들 것이다. 

Spring Initializr 에서 아래의 설정으로 프로젝트를 생성한다. 

 

Dependency: spring web, thymeleaf, jpa, h2 DB, lombok, validation

Java 11을 선택하고 Jar 를 선택하자. 

 

lombok 적용하기 

롬복 플러그인 설치: Preference -> Plugin -> lombok 검색해서 설치 

 

Preference -> Annotation Professor -> [체크하기] Enable annotation processing -> Apply 클릭

 

인텔리제이 Gradle 대신에 자바 직접 실행하기 

최근 인텔리제이 버전은 Gradle로 실행하는 것이 기본 설정이다. 

빌드 및 실행을 'IntelliJ IDEA'로 변경하면 자바로 바로 실행해서 실행 속도가 더 빠르다. 


 

라이브러리 살펴보기 

Gradle의 Dependencies를 클릭해서 라이브러리 의존성을 확인해보자. 

최상단에 스프링 웹, jpa, h2 DB, 롬복, 타임리프가 있다.

spring web 하위에 tomcat과 webmvc가 있다.

따라서 spring boot starter web 을 받으면 mvc와 tomcat서버를 모두 이용할 수 있다. 

 

JPA의 db 커넥션풀은 디폴트로 HikariCP를 내려받았다. 변경은 가능하다.

로깅: 보통 slf4j와 logback을 쓴다.

slf4j 는 로거를 찍는 인터페이스의 모음이다. 구현체로 logback을 쓴다. 구현체는 변경할 수 있긴하다.  

 

테스트 라이브러리 

junit, mokito, assertj : 테스트 편하게 해주는 라이브러리 


공부 자료 출처: 스프링부트와 JPA활용1

728x90

김영한님의 실전! 스프링부트와 JPA활용1  을 학습하고 복습을 위해 포스팅한다. 

목표

* 실무에 가까운 예제 스프링 프로젝트를 만들면서 jpa에 대한 감을 잡는다. 

* 도메인 주도 설계를 이해한다. 

목차

  1. 프로젝트 환경설정
  2. 도메인 분석 설계
  3. 애플리케이션 구현준비: 요구사항 및 아키텍처
  4. 회원 도메인 개발
  5. 상품 도메인 개발
  6. 주문 도메인 개발
  7. 웹 계층 개발

 

내용출처 : 김영한님의 실전! 스프링부트와 JPA활용1  

 

728x90

'프로그래밍 > JPA' 카테고리의 다른 글

H2 데이터베이스 설치하고 JPA 동작확인  (0) 2022.01.10
view 환경 설정  (0) 2022.01.10
프로젝트 생성  (0) 2022.01.10
JPA 다대일 단방향 양방향  (0) 2021.07.03
연관관계 매핑시 고려할 3가지  (0) 2021.07.03

JPA에서 가장 많이 사용하는 관계가 N:1 이다. 

다대일 엔티티 관계를 2개의 객체를 통해 예시 코드를 정리했다. 

 

다대일 단방향 관계 시나리오

Member 객체와 Team 객체가 있다.

멤버는 팀에 속할 수 있다. 여러 멤버는 하나의 팀에 속할 수 있다.

하나의 팀에는 여러 멤버들이 속할 수 있다. 

 

Member 객체

package hellojpa;

import javax.persistence.*;

@Entity @Getter @Setter
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="member_id") // 실제 DB에 매핑할 칼럼명
    private Long id; // 객체에서 다룰 필드명

    @Column(name = "username")  
    private String name;  

    @ManyToOne //Member 객체 입장에서 '다'니까 ManyToOne
    @JoinColumn(name = "team_id") // Team객체에서 참조하는 DB매핑 칼럼명 'team_id'
    private Team team;
}

 

Team 객체

package hellojpa;

import javax.persistence.*;

@Entity @Getter @Setter
public class Team {

    @Id @GeneratedValue
    @Column(name="team_id")
    private Long id;
    private String name;
}

 

여러 멤버들이 하나의 팀에 속할 수 있으므로, 다대일 관계다. 


다대일에서, '다'에 외래키가 있어야 한다. 

따라서 Member 객체의 필드에서  Team 객체를 필드로 만들어서 참조하도록 만든다. 

 

관계형 DB의 ERD로 생각하면,  Member 테이블의 컬럼 하나가 team_id 를 FK로 가지게 된다. 

객체의 연관관계로 표현하려면, FK 가 아니라 객체 참조 필드를 쓰면 된다.

Member.team 참조필드로 다대일 단방향 연관관계를 맺을 수 있다.

 

이렇게 Member 객체가 Team 객체를 참조할 수 있다. 


다대일 양방향 관계 시나리오

 

이 팀에 속한 멤버들 목록을 알고 싶다. 

즉, Team 객체에서 List< Member> 를 필드로 가진다. 

 

단방향과의 차이 

단방향 : Member <- Team

양방향 : Member <- Team,   Team <- Member 단방향 관계 2개를 설정하면 양방향이다. 

 

단, DB의 ERD 관점에서 설계가 변하지 않는다. 

관계형 데이터베이스 에서는 FK하나를 가지고, 조인하면 두 테이블 모두를 자유롭게 조회할 수 있다. 

관계형 데이터베이스 테이블을 보면 '방향'개념이 없다. 

 

Member 객체

package hellojpa;

import javax.persistence.*;

@Entity @Getter @Setter
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="member_id")
    private Long id;

    @Column(name = "username")
    private String name;  

    @ManyToOne // Member 엔티티 입장 중심으로 적는다.
    @JoinColumn(name = "team_id") // Team 엔티티에서 참조하는 실제컬럼명 (FK이름을) 적는다.
    private Team team;
}

 

 

Team 객체

package hellojpa;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Team {

    @Id @GeneratedValue
    @Column(name="team_id")
    private Long id;
    private String name;

    @OneToMany(mappedBy = "team") // 일대다 매핑에서, 상대팀 엔티티의 어느 필드를(칼럼을) 참조하는지 적는다.
    private List<Member> members = new ArrayList<>();

    /** 연관관계 편의 메소드 Team이나 Member 한 쪽에만 구현하기! */
    public void addMember(Member member){
        member.setTeam(member.getTeam());
        members.add(member);
   }
}

 


연관관계의 주인이란?

연관관계의 주인은 '양방향' 연관관계에서 다루는 개념이다.

외래키를 사용하는 쪽이 연관관계의 주인이다. 

 

여기서, Member.team이 연관관계의 주인이다.

mappedBy속성에는 자신을 매핑하고 있는 주인엔티티의 칼럼명을 적어준다. (Member의 team)

 

주인이 아닌 쪽은 읽기만 가능하다. 그리고 mappedBy 속성으로 주인을 지정해줘야 한다.

 

 

연관관계 편의 메소드 

Member도 Team을 참조하고, Team도 Member를 참조한다.

그래서 값을 삽입할 때 헷갈리는 부분이 있다. 

 

양방향 연관관계에서, 한 쪽을 선택하여 연관관계 편의 메소드를 작성하자.

예를 들어, Member가 속한 Team을 세팅 해 줄 때, 반대편 Team에도 member가 속함을 세팅하자.

유지보수 편의를 위함이다.

 

 

1. Member 객체에 구현

Member를 추가할 때, 반대편에 Team 객체에도 members List에 새 멤버를 추가한다. 

public void changeTeam(Team team){
	this.team = team;
	team.getMembers().add(this); // 멤버 객체의 members에 '나 자신'을 추가한다.
}

 

2. Team 객체에 구현

Team 객체를 추가할 때 member 객체를 추가한다. 

    public void addMember(Member member){
        member.setTeam(member.getTeam());
        members.add(member);
   }

 

둘 중 한 곳에만 연관관계 편의 메소드를 작성하자. 양 쪽에 작성하면 버그 발생할 확률이 높다. 


 

728x90


1. (DB테이블 관점) 다중성 : 다대일, 일대다, 일대일, 다대다 
참고) 다대다는 실무에서 쓰면 안된다. 

2. 단방향? 양방향?

테이블

테이블은 FK 하나로 양 테이블을 조인할 수 있다. 따라서 방향이라는 개념이 없다. 

 

객체

객체는 참조용 필드가 있는 쪽으로만 참조 가능하다. 단방향 2개를 설정해야 양방향 관계를 만들 수 있다.

3. 연관관계의 주인 
외래키를 사용하는 쪽이 연관관계의 주인이다. 
연관관계의 주인은 양방향 연관관계에서 다루는 개념이다.
주인이 아닌 쪽은 읽기만 가능하다. 그리고 mappedBy 속성으로 주인을 지정해줘야 한다.

728x90

'프로그래밍 > JPA' 카테고리의 다른 글

H2 데이터베이스 설치하고 JPA 동작확인  (0) 2022.01.10
view 환경 설정  (0) 2022.01.10
프로젝트 생성  (0) 2022.01.10
스프링 부트와 JPA활용1 - 개요 및 목차  (0) 2022.01.10
JPA 다대일 단방향 양방향  (0) 2021.07.03

+ Recent posts