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
:: @OneToMany
- 1 : 多
- 하나에 여러개 이므로 多의 속성은 List형태로
- mappedBy : 참조 엔티티 속성명
- @ManyToOne에서 지정한 속성명 mappedBy에 전달
- CascadeType.REMOVE :
질문 1 : 댓글 多
일 때 질문 삭제시 댓글도 모두 삭제
:: application.properties File
- 프로젝트 환경 설정
- 환경, 데이터베이스 등의 설정을 여기에 저장한다.
# DATABASE
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=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 속도 빠르다.