publicclassArticleForm {
privateString title; // 폼 제목을 받는 필드privateString content; // 폼 내용을 받는 필드publicArticleForm(String title, String content) {
this.title = title;
this.content = content;
}
@OverridepublicStringtoString() {
return"ArticleForm{" +
"title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
}
toString() 메서드 : 폼 데이터 잘 받았는지 확인 용도
4. 폼 데이터 DTO에 담기
dto 클래스 이름이 ArticleForm 이므로 ArticleForm 타입의 form 객체를 매개변수로 선언
@PostMapping("/articles/create")public String createArticle(ArticleForm form) { // 매개변수로 form 데이터를 DTO에 넣는다.
System.out.println(form.toString()); // DTO에 담긴 form 데이터를 print하는 메소드return"articles/new"; // 다시 작성게시글로 이동시킴
}
DTO 필드명과 폼 태그에 동일한 이름의 name 속성 값을 써주면 프론트엔드 → 서버 로 받은 데이터가 자동으로 DTO의 해당 필드에 값이 들어갑니다.
요약
3 - DTO를 데이터베이스에 저장하기
데이터베이스
데이터를 관리하는 창고
모든 데이터를 행과 열로 구성된 테이블에 저장
사용 언어 : SQL
DBMS : MySQL, 오라클, MariaDB, H2 DB
H2 DB
자바로 작성된 RDBMS
인메모리형 관계형 DB
데이터를 애플리케이션 자체 내부에 저장.
앱을 재실행하면 데이터 초기화
간편하게 사용하기 좋아 개발 시 테스트 용도로 많이 사용
실제 서비스에는 사용하지 않음.
ORM(Object-Relational Mapping)
자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법
DB 값을 객체처럼 사용할 수 있어 SQL 없이 자바로 데이터베이스를 조작할 수 있음
→ 자바 언어로 DB에 명령을 내리는 도구
ORM 여러 종류 중 자바에서는 JPA를 표준으로 사용함
장점 : 자바언어로 SQL 없이 DB를 다룰 수 있다.
JPA(Java Persistence API)
자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
자바 객체와 DB를 연결해 데이터를 관리
실제 사용을 위해서는 추가로 ORM 프레임워크를 선택해야 함 → 하이버네이트
ORM 프레임워크 - 하이버네이트(hibernate)
JPA 인터페이스를 구현한 구현체
구현체마다 회사 이름이나 프레임워크 이름이 다름. 그 중 가장 유명한 것이 Hibernate임
내부적으로 JDBC API 사용
목표 : 자바 객체를 통해 DB 종류에 상관 없이 DB를 자유롭게 사용하는 것
JPA의 핵심 도구
엔티티(entity)와 리파지터리(repository)
엔티티
자바 객체를 DB가 이해할 수 있게 만든 것.
이를 기반으로 테이블이 만들어짐
리파지터리
엔티티가 DB 속 테이블에 저장 및 관리될 수 있게 하는 인터페이스
실습
DTO를 엔티티로 변환하기
리파지터리 인터페이스를 이용해 엔티티를 DB에 저장하기
1 - DTO를 엔티티로 변환하기
Article 엔티티 클래스 생성
toEntity( ) 메소드 추가
DTO인 form 객체를 엔티티 객체로 변환하는 역할
ArticleDto.class
public Article toEntity() {
// Article 클래스 생성자 형식에 맞게 작성함. id 정보는 없으므로 null
return newArticle(null, title, content);
}
ArticleEntity.class
@Entity@Table(name="BoardArticle") // 테이블 명 명시 지정
public class Article {
@Id// Primary Key 지정@GeneratedValue// 자동 생성 기능(시퀀스, 오토인큐리먼트)
private Long Id;
@Column(name="title") // title 필드 선언, DB 테이블의 title 열과 연결됨
private String title;
@Column(name="content") // content 필드 선언, DB 테이블의 content 열과 연결됨
private String content;
리파지터리로 엔티티를 DB에 저장하기1. 리파지터리 만들기 : 엔티티가 DB속 테이블에 저장 및 관리될 수 있게 하는 인터페이스
CrudRepository<T, ID> 의 제네릭 요소 T, ID 지정
T : 관리 대상 엔티티의 클래스 타입 지정
ID : 관리 대상 엔티티의 기본키 타입 지정
// SQL를 대신하는 메서드가 있을건데 이미 다 인터페이스로 되어 있는데 그걸 상속만 받으려고 interface로 명명 public interface ArticleRepository extends CrudRepository<Article, Long> { // <엔티티 명,기본키 타입> }
※. 리파지터리
JPA에서 제공하는 리파지터리 인터페이스를 활용해 만들 수 있음.
JPA의 구현체인 Hibernate를 이용하기 위한 여러 API 제공함
JpaRepository 나 CrudRepository를 상속 받아 사용
DB 에 CRUD 기본 동작을 추가 코드로 구현할 필요 없이 CruidRepository에서 상속받아 사용할 수 있음.
단순한 CRUD 작업만한다면 : CrudRepository 상속
CRUD 작업 + 페이지 처리 + 정렬 : JpaRepository 상속
Repository가 최상위 인터페이스
JpaRepository 메서드
insert와 update 메서드가 동일하게 save임
내부적으로 값들이 일치하는지 확인하고 수정 되었으면 UPDATE, 없으면 INSERT
리파지터리 객체 주입 및 엔티티 DB 저장
ArticleController.class
publicclassArticleController {
@Autowired// 스프링부트가 미리 생성해 놓은 리파지터리 객체 주입(DI) = 의존성 주입private ArticleRepository articleRepository; // articleRepository 객체 선언
....
@PostMapping("/articles/create")public String createArticle(ArticleForm form) { // 매개변수로 form 데이터를 DTO에 넣는다.
System.out.println(form.toString()); // DTO에 담긴 form 데이터를 print하는 메소드// Dto를 Entity로 변환
Article article = form.toEntity(); // 받은 데이터를 Dto로 변환하고 다시 Entity로 변환한다.// Entity를 DB에 저장
Article saved = articleRepository.save(article);
return"new"; // 다시 작성게시글로 이동시킴
}
}
의존성 주입(DI, dependency Injection)이란?
외부에서 만들어진 객체를 필요한 곳으로 가져오는 기법
스프링 부트에서는 @Autowired 어노테이션으로 의존성 주입
DB 저장 확인
public class ArticleController {
@Autowired // 스프링부트가 미리 생성해 놓은 리파지터리 객체 주입(DI) = 의존성 주입private ArticleRepository articleRepository; // articleRepository 객체 선언
.....
@PostMapping("/articles/create")
public String createArticle(ArticleForm form) { // 매개변수로 form 데이터를 DTO에 넣는다.System.out.println(form.toString()); // DTO에 담긴 form 데이터를 print하는 메소드// Dto를 Entity로 변환
Article article = form.toEntity(); // 받은 데이터를 Dto로 변환하고 다시 Entity로 변환한다.// Entity를 DB에 저장
Article saved = articleRepository.save(article);
System.out.println(saved.toString()); //article이 DB에 저장 확인
DB 데이터 조회
id, title, content 3개의 열로 구성됨
4.1 H2 DB 접속하기
src > main > resources > application.properties 파일
H2 DB에 웹 콘솔로 접근할 수 있도록 허용 설정
서버 재시작 → localhost:8080/h2-console 접속
JDBC URL에 서버가 구동되면서 터미널 창에 쓰여진 주소로 접속한다.
서버 시작 시 매번 달라짐
어노테이션
@Entity
엔티티 클래스임을 선언하기 위해 JPA에서 제공하는 어노테이션
이 클래스를 기반으로 DB에 테이블이 생성됨
테이블 이름은 클래스 이름과 동일하게 지정됨(Article)
별도의 테이블 이름을 주고 싶으면 @Table(name=“테이블명“)으로 지정
@ Id
Primary Key(기본키) 선언 어노테이션
@GeneratedValue 자동생성되는 번호
@GeneratedValue(strategy = GenerationType.IDENTITY) 키생성 전략
public class ArticleController {
....
System.out.println("form 데이터 : " + form.toString());
// println 대신 log.info로 대체log.info("form 데이터 : " + form.toString());
publicclassArticleForm {
privateString title; // 폼 제목을 받는 필드privateString content; // 폼 내용을 받는 필드publicArticleForm(String title, String content) {
this.title = title;
this.content = content;
}
@OverridepublicStringtoString() {
return"ArticleForm{" +
"title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
}
toString() 메서드 : 폼 데이터 잘 받았는지 확인 용도
4. 폼 데이터 DTO에 담기
dto 클래스 이름이 ArticleForm 이므로 ArticleForm 타입의 form 객체를 매개변수로 선언
@PostMapping("/articles/create")public String createArticle(ArticleForm form) { // 매개변수로 form 데이터를 DTO에 넣는다.
System.out.println(form.toString()); // DTO에 담긴 form 데이터를 print하는 메소드return"articles/new"; // 다시 작성게시글로 이동시킴
}
DTO 필드명과 폼 태그에 동일한 이름의 name 속성 값을 써주면 프론트엔드 → 서버 로 받은 데이터가 자동으로 DTO의 해당 필드에 값이 들어갑니다.
요약
3 - DTO를 데이터베이스에 저장하기
데이터베이스
데이터를 관리하는 창고
모든 데이터를 행과 열로 구성된 테이블에 저장
사용 언어 : SQL
DBMS : MySQL, 오라클, MariaDB, H2 DB
H2 DB
자바로 작성된 RDBMS
인메모리형 관계형 DB
데이터를 애플리케이션 자체 내부에 저장.
앱을 재실행하면 데이터 초기화
간편하게 사용하기 좋아 개발 시 테스트 용도로 많이 사용
실제 서비스에는 사용하지 않음.
ORM(Object-Relational Mapping)
자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법
DB 값을 객체처럼 사용할 수 있어 SQL 없이 자바로 데이터베이스를 조작할 수 있음
→ 자바 언어로 DB에 명령을 내리는 도구
ORM 여러 종류 중 자바에서는 JPA를 표준으로 사용함
장점 : 자바언어로 SQL 없이 DB를 다룰 수 있다.
JPA(Java Persistence API)
자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
자바 객체와 DB를 연결해 데이터를 관리
실제 사용을 위해서는 추가로 ORM 프레임워크를 선택해야 함 → 하이버네이트
ORM 프레임워크 - 하이버네이트(hibernate)
JPA 인터페이스를 구현한 구현체
구현체마다 회사 이름이나 프레임워크 이름이 다름. 그 중 가장 유명한 것이 Hibernate임
내부적으로 JDBC API 사용
목표 : 자바 객체를 통해 DB 종류에 상관 없이 DB를 자유롭게 사용하는 것
JPA의 핵심 도구
엔티티(entity)와 리파지터리(repository)
엔티티
자바 객체를 DB가 이해할 수 있게 만든 것.
이를 기반으로 테이블이 만들어짐
리파지터리
엔티티가 DB 속 테이블에 저장 및 관리될 수 있게 하는 인터페이스
실습
DTO를 엔티티로 변환하기
리파지터리 인터페이스를 이용해 엔티티를 DB에 저장하기
1 - DTO를 엔티티로 변환하기
Article 엔티티 클래스 생성
toEntity( ) 메소드 추가
DTO인 form 객체를 엔티티 객체로 변환하는 역할
ArticleDto.class
public Article toEntity() {
// Article 클래스 생성자 형식에 맞게 작성함. id 정보는 없으므로 null
return newArticle(null, title, content);
}
ArticleEntity.class
@Entity@Table(name="BoardArticle") // 테이블 명 명시 지정
public class Article {
@Id// Primary Key 지정@GeneratedValue// 자동 생성 기능(시퀀스, 오토인큐리먼트)
private Long Id;
@Column(name="title") // title 필드 선언, DB 테이블의 title 열과 연결됨
private String title;
@Column(name="content") // content 필드 선언, DB 테이블의 content 열과 연결됨
private String content;
리파지터리로 엔티티를 DB에 저장하기1. 리파지터리 만들기 : 엔티티가 DB속 테이블에 저장 및 관리될 수 있게 하는 인터페이스
CrudRepository<T, ID> 의 제네릭 요소 T, ID 지정
T : 관리 대상 엔티티의 클래스 타입 지정
ID : 관리 대상 엔티티의 기본키 타입 지정
// SQL를 대신하는 메서드가 있을건데 이미 다 인터페이스로 되어 있는데 그걸 상속만 받으려고 interface로 명명 public interface ArticleRepository extends CrudRepository<Article, Long> { // <엔티티 명,기본키 타입> }
※. 리파지터리
JPA에서 제공하는 리파지터리 인터페이스를 활용해 만들 수 있음.
JPA의 구현체인 Hibernate를 이용하기 위한 여러 API 제공함
JpaRepository 나 CrudRepository를 상속 받아 사용
DB 에 CRUD 기본 동작을 추가 코드로 구현할 필요 없이 CruidRepository에서 상속받아 사용할 수 있음.
단순한 CRUD 작업만한다면 : CrudRepository 상속
CRUD 작업 + 페이지 처리 + 정렬 : JpaRepository 상속
Repository가 최상위 인터페이스
JpaRepository 메서드
insert와 update 메서드가 동일하게 save임
내부적으로 값들이 일치하는지 확인하고 수정 되었으면 UPDATE, 없으면 INSERT
리파지터리 객체 주입 및 엔티티 DB 저장
ArticleController.class
publicclassArticleController {
@Autowired// 스프링부트가 미리 생성해 놓은 리파지터리 객체 주입(DI) = 의존성 주입private ArticleRepository articleRepository; // articleRepository 객체 선언
....
@PostMapping("/articles/create")public String createArticle(ArticleForm form) { // 매개변수로 form 데이터를 DTO에 넣는다.
System.out.println(form.toString()); // DTO에 담긴 form 데이터를 print하는 메소드// Dto를 Entity로 변환
Article article = form.toEntity(); // 받은 데이터를 Dto로 변환하고 다시 Entity로 변환한다.// Entity를 DB에 저장
Article saved = articleRepository.save(article);
return"new"; // 다시 작성게시글로 이동시킴
}
}
의존성 주입(DI, dependency Injection)이란?
외부에서 만들어진 객체를 필요한 곳으로 가져오는 기법
스프링 부트에서는 @Autowired 어노테이션으로 의존성 주입
DB 저장 확인
public class ArticleController {
@Autowired // 스프링부트가 미리 생성해 놓은 리파지터리 객체 주입(DI) = 의존성 주입private ArticleRepository articleRepository; // articleRepository 객체 선언
.....
@PostMapping("/articles/create")
public String createArticle(ArticleForm form) { // 매개변수로 form 데이터를 DTO에 넣는다.System.out.println(form.toString()); // DTO에 담긴 form 데이터를 print하는 메소드// Dto를 Entity로 변환
Article article = form.toEntity(); // 받은 데이터를 Dto로 변환하고 다시 Entity로 변환한다.// Entity를 DB에 저장
Article saved = articleRepository.save(article);
System.out.println(saved.toString()); //article이 DB에 저장 확인
DB 데이터 조회
id, title, content 3개의 열로 구성됨
4.1 H2 DB 접속하기
src > main > resources > application.properties 파일
H2 DB에 웹 콘솔로 접근할 수 있도록 허용 설정
서버 재시작 → localhost:8080/h2-console 접속
JDBC URL에 서버가 구동되면서 터미널 창에 쓰여진 주소로 접속한다.
서버 시작 시 매번 달라짐
어노테이션
@Entity
엔티티 클래스임을 선언하기 위해 JPA에서 제공하는 어노테이션
이 클래스를 기반으로 DB에 테이블이 생성됨
테이블 이름은 클래스 이름과 동일하게 지정됨(Article)
별도의 테이블 이름을 주고 싶으면 @Table(name=“테이블명“)으로 지정
@ Id
Primary Key(기본키) 선언 어노테이션
@GeneratedValue 자동생성되는 번호
@GeneratedValue(strategy = GenerationType.IDENTITY) 키생성 전략
public class ArticleController {
....
System.out.println("form 데이터 : " + form.toString());
// println 대신 log.info로 대체log.info("form 데이터 : " + form.toString());