백견불여일타 스프링부트 쇼핑몰 project With JPA

JP Kang·2022년 6월 5일
0

Book

목록 보기
2/8
post-thumbnail

😅책과 다른 내개발환경

  1. 운영체제 : Window 10
  2. 통합개발환경(IDE) : (수정) Eclipse -> inteliJ
    Querydsl 호환문제로;; Tool바꿈
  3. JDK 버전 : JDK 11.0.14
  4. 스프링 부트 버전 : 2.7.0
  5. 데이터베이스 : MySQL
  6. 빌드 툴 : 메이븐

-----Application.properties 기본설정값-----

#Application port setting
server.port=80

#MySQL Connection setting
spring.datasource.diver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/shop?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=1234

#print console out in Executing
spring.jpa.properties.hibernate.show_sql=true

#In console, formatting for reading well
spring.jpa.properties.hibernate.format_sql=true

#Question Query& binding parameter in console
logging.level.org.hibernate.type.descriptor.sql=trace

spring.jpa.hibernate.ddl-auto=create
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect


위 ddl 옵션 총 5가지 옵션이 있다
a) none: 사용하지않음
b) create: 기존 테이블 삭제 후 테이블 생성
c) create-drop : 기존 테이블 삭제 후 테이블 생성. 종료 시점에 테이블 삭제
d) update: 변경된 스키마 적용
e) validate: 엔터티와 테이블 정상 매핑 확인

#잠깐, 용어설명
스테이징 환경 : 운영환경과 거의 동일한 환경으로 구성하여, 운영환경에 배포하기 전 여러가지 기능(성능, 장애 등)을 검증하는 환경.
운영환경: 실제 서비스를 운영하는 환경
--- JPA 사용전 사전정보 ---

@RestController

  • Restful Web API를 좀 더 쉽게 만들기 위해 스프링 프레임워크 4.0에 도입된 기능.
    @Controller와 @ResponseBody를 합쳐놓은 어노테이션.
    클래스 이름 위에 @Controller 어노테이션을 선언하면 해당 클래스에 요청을 처리함
    @ResponseBody 어노테이션은 자바 객체를 HTTP응답 본문의 객체로 변환해 클라이언트에게 전송
    따라서, 따로 html 파일을 만들지 않고 웹브라우저에 "문자 Blah Blah" 문자열 출력 할 수있음(와우!)

@GetMapping
컨트롤러 클래스에 @GetMapping 어노테이션을 이용해 클라이언트의 요청을 처리할 URL을 매핑.
현재는 서버의 루트로 오는 요청 처리하도록 value="/"로 선언함.

*Lombok 라이브러리에 대해,,

어노테이션 | 설명
@Getter/Setter | 코드를 컴파일 할 때 속성들에 대한 Getter/Setter 메소드 생성
@ToString | toString() 메소드 생성
@ToString(exclude={"변수명"}) | 원하지 않는 속성을 제외한 toString() 메소드 생성
@NonNull | 해당 변수가 null체크. NullPointerException 예외 발생
@EqualsAndHashCode | equals() hashCode() 메소드 생성
@Builder | 빌더 패턴을 이용한 객체 생성
@NoArgsConstructor | 파라미터가 없는 기본 생성자 생성
@AllArgsConsturctor | 모든 속성에 대한 생성자 생성
@RequiredArgsConstructor | 초기화 되지 않은 Final, @NonNull 어노테이션이 붙은 피드에 대한 생성자 생성
@Log | log 변수 자동 생성
@Value | 불변(immutable) 클래스 생성
@Data | @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequredArgsConstructor를 합친 어노테이션

// int vs Integer 차이점 알아볼것

MySQL database 기본설정
한글설정(encoding UTF-8) : create database shop default character set utf8 collate utf8_general_ci;

*JPA (Java Persistence API')

  • 자바 ORM('Object Realational Mapping'-객체와 관계형 데이터 베이스를 매핑)기술에 대한 API표준.
  1. 도입이유 : SQL문을 통해 객체를 변환저장, 데이터베이스를 SQL문작성 하는 상호반복(패러다임 불일치)에 대해 '객체지향적'프로그랭밍하기위해 ORM나옴.
    [ 자바 객체 <-> ORM <-> 관계데이터 베이스 ] // ORM이 2개를 매핑, 비즈니스 로직 상향 UP!
    따라서, 구현체로 Hibernate,EclipseLink, DataNucleus, OpenJpa, TopLink 등이 생김. // 가장 대표적 오픈소스 'Hibernate'

  2. 장점과 단점
    장점)
    a) 특정베이스에 종속되지 않음
    - ex) 오라클DB <-> MariaDB 각각의 쿼리문? 다름. But, JPA는 추상화한 데이터 접근 계층 제공 가능! 설정파일에 특정 데이터베이스를 설정해주면 언제든 사용 용이.
    b) 객체 지향적 프로그래밍
    - 데이터베이스 설계 중심의 패러다임에서 객체지향적으로 설계 가능. 비즈니스 로직에 집중도움.
    c) 생산성 향상
    - 테이블과 매핑된 클래스에 필드만 추가한다면, 쉽게 관리 가능. And, SQL문을 직접 작성X, 객체를 사용하여 동작하기 떄문에 유지보수UP 재사용성UP

    단점)
    a) 복잡한 쿼리 처리
    - 보완하기 위해 JPQL지원
    b) 성능 저하 위험
    - 객체 간의 매핑 설계를 잘못 했을 때 성능 저하 발생. And 자동생성 쿼리가 많아 성능 DOWN!
    c) 학습시간
    - 개인적으로 관계형 데이터베이스를 충분히 알아야 JPA를 잘 사용 할 수 있어, 관계형 데이터베이스 학습 후 JPA사용 권장.

  3. JPA 동작방식
    [ Entity Manager Factory --create--> Entity Manger --operation--> Entities(각 각의 Entity In Persistence Context)]

    *엔터티 : 데이터베이스의 테이블에 대응하는 클래스. @Entity가 붙은 클래스는 JPA에서 관리하며 엔터라고 함. 데이터베이스에 item 테이블을 만들고,
    이에 대응되는 Item.java 클래스를 만들어서 @Entity 어노테이션을 붙이면 이 클래스가 엔터티가 됨. 클래스 자체 or 생성된 인스턴스도 엔터티임.

    *엔터티 매니저 팩토리 : 엔터티 매니저 인스턴스를 관리하는 주체. 애플리케이션 실행시 1개만 만들어지고, 사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔터티 매니저를 생성함.

    *엔터티 매니저 : 영속성 컨텍스트에 접근하여 엔터티에 대한 데이터베이스 작업을 제공함.
    [엔터티 매니저 메소드]
    a) find()메소드 : 영속성 컨텍스트에서 엔터티를 검색하고 영속성 컨텍스트에 없을 경우 데이터베이스에서 데이터를 찾아 영속성 컨텍스트에 저장함.
    b) persist()메소드 : 엔터티를 영속성 컨텍스트에 저장함.
    c) remove() 메소드 : 엔터티 클래스를 영속성 컨텍스트에서 삭제함.
    d) flush() 메소드 : 영속성 컨텍스트에 저장된 내용을 데이터베이스에 반영

    *영속성 컨텍스트(Persistence Context)

  • 사용시 이점 : 중간계층을 만들어 버퍼링, 캐싱 등을 할 수 있음.

    *Thymeleaf : 서버에서 가공한 데이터를 뷰에 보여주기 위한 템플릿 엔진으로 타임리프 의존성을 추가함.

    *H2 Database: H2 Database는 자바 기반의 관계형 데이터 베이스로 매우 가볍고 빠른 데이터베이스임.
    디스크 기반의 데이터 저장뿐만 아니라 메모리 내에 데이터를 저장하는 인메모리 데이터 베이스 기능을 지원함.
    데이터를 영구적으로 저장하는데 권장하는 데이터베이스는 아니지만 위의 장점들로 테스트용 데이터베이스로 많이 사용.

// 엔터티 매핑 관련 어노테이션
@Entity : 클래스를 엔터티로 선언
@Table : 엔터티와 매핑할 테이블을 지정
@Id : 테이블의 기본키에 사용할 속성을 지정
@GeneratedValue : 키 값을 생성하는 전략 명시
@Colum : 필드와 컬럼 매핑
@Lob : BLOB, CLOB 타입 매핑(용어설명참조)
@CreationTimestamp : insert시 시간 자동 저장
@updateTimestamp : update 시 시간 자동 저장
@Enumerated : enum 타입 매핑
@Transient : 해당 필드 데이터베이스 매핑 무시
@Temporal : 날짜 타입 매핑
@CreateDate : 엔터티가 생성되어 저장될 때 시간 자동 저장
@LastModifiedDate : 조회한 엔터티의 값을 변경할 때 시간 자동 저장

  • CLOB 과 BLOB의 의미
    CLOB : 사이즈가 큰 데이터를 외부 파일로 저장하기 위한 데이터 타입. 문자형 대용량 파일을 저장하는데 사용하는 데이터 타입이라고 생각하면 됨.

    BLOB: 바이너리 데이터를 DB 외부에 저장하기 위한 타입입니다. 이미지, 사운드, 비디오 같은 멀티미디어 데이터를 다룰 때 사용 할 수 있습니다.

    // @Column 어노테이션 추가 속성

    ㅁ속성 : 설명 - 기본값

    ㅁname : 필드와 매핑할 컬럼의 이름 설정 - 객체의 필드 이름

    ㅁunique(DDL) : 유니크 제약 조건 설정

    ㅁinsertable : insert 기능 여부 - true

    ㅁupdatable : update 기능 여부 - true

    ㅁlength : String 타입의 문자길이 제약조건 설정 - 255

    ㅁnullable : null값의 허용여부 설정. false 설정 시 DDL 생성 시에 not null 제ㅔ약조건 추가

    ㅁcolumnDefinition : 데이터베이스 컬럼 정보 직접 기술
    ex) @Column(columnDefinition = "varchar(5)" default'10' not null")

ㅁprecision, scale(DDL) : BigDecimal타입에서 사용(Biginter 가능) precision은 소수점을 포함한 전체 자리수이고, scale은 소수점 자리수. Double과 float타입에는 적용되지 않음.


// @GenerationValue 어노테이션 전략 4가지

ㅁ생성 전략 : 설명

ㅁ GenerationTypeAUTO(default) : JPA 구현체가 자동으로 생성 전략 결정

ㅁ GenerationType.IDENTITY : 기본키 생성을 데이터베이스에 위임

ㅁ GenerationType.SEQUENCE : 데이터베이스 시퀀스 오브젝트를 이용한 기본키 생성,
@SequenceGeneration를 사용하여 시퀀스 등록 필요

ㅁ GenerationType.TABLE : 키 생성용 테이블 사용. @TableGenerator 필요


// JpaRepository에서 지원하는 메소드 예시

메소드 : 기능

save(S entity) : 엔터티 저장 및 수정

void delete(T entity) : 엔터티 삭제

count() : 엔터티 총 개수 반환

Iterable findAll() : 모든 엔터티 조회

profile
자기개발자중

0개의 댓글