본문 바로가기

spring boot

JPA / spring boot 기초 (JPA / ORM, 접근 제어자, lombok, Repository, @Entity)

JPA란

 

자바에서 사용하는 ORM 기술 표준

 

ORM이란

 

자바에서 객체를 생성하고 DB에 접근하기 위해 쿼리문을 짰다.

하지만 ORM을 사용하면 자바 코드, 쿼리문 따로 작성할 필요가 없이 자바의 문법만으로 DB에 접근이 가능하다.

 

 

true는 JPA 문법쓸 때 SQL 따로 출력

 

update는 테이블 생성의 자동화 여부

(update는 변경사항만 적용함)

 

 

@Entity

class의 이름으로 테이블을 생성해주는 JPA 어노테이션

 

 

spring의 vo 선언처럼 원하는 타입의 변수를 선언하면 이는 곧 Item 테이블의 컬럼이 된다.

 

PK 값을 가져야 하는 id 컬럼은 @Id 어노테이션을 붙여야 한다.

또한 @GeneratedValue(strategy = GenerationType.IDENTITY)는 SQL 오토 인크리먼트 기능을 한다.

 

 

위에서 Item이라는 테이블을 생성하고 쿼리문으로 해당 데이터를 넣으려 했다.

처음엔 해당 데이터베이스를 못 찾는다는 에러가 발생해 찾아보니

 

show databases; 로 데이터베이스들을 찾고

use 사용할 디비명; 으로 데이터베이스를 지정한 후에 쿼리문이 사용 가능해진다.

 

 

 

해당 컬럼들에 접근제어자 private를 붙여 getter, setter 없이는 접근이 불가하게 설정했다.

 

 

@Column 어노테이션을 사용해 해당 컬럼에 제약을 줄 수도 있다.

위에선 null 값을 받지 않고 title이란 컬럼의 데이터들은 서로가 유니크하지 않으면 저장을 막게끔 설정했다.

 

 

위의 컬럼 속성은 String에서 기본 길이는 255자까지만 허용된다.

위 두 속성은 그 제한을 조절하는 옵션들이다.

 

 

JPA로 데이터 입출력하기

 

1. repository 생성 (spring의 service, impl?)

2. 원하는 클래스에 repository 등록

3. repository.입출력문법() 사용

 

 

1. repository 생성

 

레파지토리의 네임은 해당 엔티티 뒤에 레파지토리 붙이는게 일반적

extends JpaRepository<엔티티명, id 타입> 필수

 

 

2. 원하는 클래스에 repository 등록

 

boot에선 @RequiredArgsConstructor 를 클래스 위에 붙이고

빈 등록할 레파지토리를 private final 뒤에 붙이면 @Autowired 사용하지 않고 등록이 가능하다.

lombok 문법

 

의존성 주입을 한다는 뜻인데 이는 즉, 상단에 ItemRepository를 등록해놓고 다른 함수에서 new키워드로 새로 만들 필요 없이 위에 등록한 리포지토리를 의존해 새로운 해당 타입 오브젝트를 가져온다는 뜻이다.

 

 

3. repository.입출력문법() 사용

 

 

findAll() 이라는 함수로 해당 리파지토리 안의 모든 데이터를 가져왔다.

이를 변수에 담기 위해선 변수의 타입을 지정하는 것 또한 필요하다.

 

해당 리파지토리 안에는 여러 타입들의 데이터가 있을 수 있기 때문에

또한 데이터들이 하나가 아닐 수 있기 때문에 List 형식의 Item (해당 리파지토리 타입) 으로 받아온다.

 

 

static 폴더 안의 파일들은 root 경로로 설정된다.

 

 

백단에서 model에 담은 데이터를 thymleaf 문법으로 프론트단에 전달해준다.

 

 

접근 제어자

public : 해당 프로젝트 어디서나 접근 가능

private : 현재 클래스 외부에서 접근 불가능 (getter, setter 사용시 가능)

" " && protected : 현재 폴더에서만 사용가능하나 상속받은 클래스 또한 사용 가능 

static : 인스턴스 생성을 하지 않고 원본 변수나 함수에 접근 가능 (Item.title)

 

private을 사용하는 이유는 쉽게 변수나 함수를 수정하다 실수를 범하지 않기 위해 getter, setter라는 최소한의 안전장치를 두는 것