점프 투 스프링부트 | 2장 Controller, JPA, Entity

5w31892p·2022년 12월 29일
0

Spring

목록 보기
17/30

404 -> 페이지 찾을 수 없음

httpStatusCode

아래와 같은 경우 index라는 문자열을 반환하지만
@ResponseBody가 없다면 템플릿 폴더에서 index 파일을 찾는다.

@ResponseBody
...
return "index"

카멜케이스로 쓴 컬럼명은 실제 테이블에서 모두 소문자로 바뀌고 언더바로 단어 구분하여 컬럼명이 된다.
createDate -> create_data


:: ORM

  • ORM Class = Entity
  • ORM은 내부에 SQL 쿼리를 자동 생성해준다.
  • 데이터베이스 종류에 상관없이 일관된 코드를 유지할 수있다.
  • 즉, 유지보수가 편리하다.
  • 개발자가 달라도 통일된 쿼리 작성이 가능하여 오류 발생률이 낮다.

:: JPA

  • 자바진영에서 ORM의 기술 표준으로 사용하는 인터페이스
  • 인터페이스 이기 때문에 구현하는 실제 Class가 필요하다.
  • JPA 구현한 실제 클래스로 하이버네이트(HiberNate)가 있다.

:: H2

  • 개발용 또는 경량 데이터베이스용
  • 개발시에는 H2로, 실제 운영은 규모있는 DB를 사용한다.

:: Entity

  • 데이터베이스 테이블과 매핑되는 자바클래스
  • Model or Domain Model이라고도 한다.
  • 일반적으로 @Setter 구현하지 않기를 권함
    • entity는 DB와 직접 연결되기 때문에 데이터 변경이 가능한 Setter는 안전하지 못함
  • @Setter 없이 데이터 저장은 @Build 사용

entity class에 다른 entity class 추가

  • 연결 관계를 명시적으로 표시해야 한다.
  • 연결 하는 양쪽 entity에 표시해야 한다.
public class Answer {
  @ManyToOne
  private Question question;
}

...

public class Question {
  @OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
  private List<Answer> answerList;
}

:: @SpringBootApplcation

  • 스프링부트의 모든 설정 관리

:: @Entity

  • JPA가 Entity로 인식할 수 있게 한다.
  • @Column을 쓰지 않아도 컬럼으로 인식한다.
  • 컬럼으로 인식 못하게 하려면 @Transient 사용

:: @Id

  • 기본키로 지정 (기본키로 지정되면 동일한 값으로 저장 안됨)
  • 즉, Primary Key (PK)

:: @GeneratedValue

  • 저장시 +1씩 자동 증가
  • strategy : 고유 번호 생성 옵션 (생략시 일전 순서의 고유 번호 안됨.)
  • GererationType.IDENTITY : 독립된 시퀀스를 적용해 번호 증가에 사용 (일반적)

:: @Column

  • 테이블 컬럼명과 일치
  • 컬럼 세부사항 설정을 위해 사용
  • length : 컬럼의 길이 지정
  • columnDefinition : 컬럼 속성 정의
    • columnDefinition = "TEXT" : "글의 내용"처럼 글자수 제한할 수 없는 경우 사용

:: @Transient

  • 해당 데이터를 테이블의 컬럼과 매핑 시키지 않는다.
  • 데이터와 컬럼 매핑 관계 제외
  • @Entity가 컬럼으로 인식 못하게

:: @ManyToOne

  • 多 : 1

:: @OneToMany

  • 1 : 多
  • 하나에 여러개 이므로 多의 속성은 List형태로
  • mappedBy : 참조 엔티티 속성명
    • @ManyToOne에서 지정한 속성명 mappedBy에 전달
  • CascadeType.REMOVE : 질문 1 : 댓글 多 일 때 질문 삭제시 댓글도 모두 삭제

:: application.properties File

  • 프로젝트 환경 설정
  • 환경, 데이터베이스 등의 설정을 여기에 저장한다.
# DATABASE
spring.h2.console.enabled=true // H2 콘솔 접속을 허용할지의 여부, true
spring.h2.console.path=/h2-console // 콘솔 접속을 위한 URL 경로
spring.datasource.url=jdbc:h2:~/local // 데이터베이스 접속을 위한 경로
spring.datasource.driverClassName=org.h2.Driver // 데이터베이스 접속시 사용하는 드라이버
spring.datasource.username=sa // 데이터베이스 사용자명 (default값 = sa)
spring.datasource.password= // 데이터베이스 패스워드, 로컬 개발용이기에 노설정
>
# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect // 데이터베이스 엔진 종류 설명
spring.jpa.hibernate.ddl-auto=update // 엔티티 기준으로 테이블 생성하는 규칙 정의

spring.jpa.hibernate.ddl-auto

개발 환경에서는 보통 update 사용
실제 운영 환경에서는 none or validate 사용

  • none : 엔티티 변경되더라도 db는 변경되지 않음
  • update : 엔티티 변경된 부분만 적용
  • validate : 변경사항이 있는지 검사만
  • create : 스프링부트 서버가 시작될 때 모두 drop하고 다시 생성
  • create-drop : create와 동일하지만, 종료시에도 모두 drop한다.

:: build.gradle - dependencies

  • runtimeOnly : 런타임에만 필요
  • compileOnly : 컴파일시에만 필요
  • implementation : 일반 사용설정
    • 해당 라이브러리 변경되더라도 연관된 모든 모듈 컴파일 하지 않고, 직접 관련 있는 모듈들만 컴파일한다.
    • 그러므로 rebuild 속도 빠르다.

0개의 댓글