dew's CSE Studying
스프링부트3 백엔드 개발 3~5장 본문
Part2 게시판 CRUD 만들기
3장 게시판 만들고 새 글 작성하기: Create
3.1 폼 데이터란
폼 데이터: HTML 요소인 <form> 태그에 실려 전송되는 데이터
-웹브라우저에서 서버로 데이터를 전송할 때 사용
-<form>태그에 실어 보낸 데이터는 서버의 컨트롤러가 객체(DTO: Data Transfer Object)에 담아 받은 후, 최종적으로 데이터베이스에 저장된다
3.2 폼 데이터를 DTO로 받기
3.2.1 입력 폼 만들기
3.2.2 컨트롤러 만들기
3.2.3 폼 데이터 전송하기
3.2.4 폼 데이터 받기
받는건 @PostMapping()을 사용한다
괄호 안에는 받는 url 주소를 넣는다
3.2.5 DTO 만들기
3.2.6 폼 데이터를 DTO에 담기
3.2.7 입력 폼과 DTO 필드 연결하기
DTO와 동일한 이름을 name의 속성값으로 써 주면 입력 폼에서 작성한 두 데이터가 DTO의 해당 필드와 연결된다
3.3 DTO를 데이터베이스에 저장하기
3.3.1 데이터베이스와 JPA
데이터베이스: 데이터를 관리하는 창고
JPA(Java Persistence API): 자바 언어로 DB에 명령을 내리는 도구로 데이터를 객체 지향적으로 관리할 수 있게 해준다
<JPA의 핵심도구>
-엔터티: 자바 객체를 DB가 이해할 수 있도록 만든 것. 이를 기반으로 테이블이 만들어진다
-리파지터리: 엔터티가 DB 속 테이블에 저장 및 관리될 수 있게 하는 인터페이스
<DTO로 받은 폼 데이터를 DB에 어떻게 저장할까?>
1)DTO를 엔터티로 변환하기
2)리파지터리를 이용해 엔터티를 DB에 저장하기
3.3.2 DTO를 엔터티로 변환하기
package com.example.firstproject.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
@Entity //엔티티 선언
public class Article {
@Id //엔티티의 대푯값 지정
@GeneratedValue //자동생성기능 추가
private Long id;
@Column //DB테이블의 title열과 연결
private String title;
@Column //DB테이블의 content열 연결
private String content;
// Article 생성자 추가
public Article(Long id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
public Article() {
}
// toString() 메서드 추가
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
}
Article 클래스를 만들고 toEntity() 메서드를 추가해주었다
3.3.3 리파지터리로 엔터티를 DB에 저장하기
이때 @Autowired를 사용해서 스프링 부트가 만들어 놓은 객체를 주입해주었다(의존성 주입, DI, Dependenct Injection)
폼 데이터를 받는 객체인 DTO에 저장(DTO의 클래스 타입은 ArticleForm이었다)
DTO가 엔터티로 변환(엔터티의 클래스 타입은 Article이었다)
리파지터리가 엔터티를 DB에 저장해 saved라는 엔터티 변수에 반환(엔터티의 클래스 타입은 Article)
순서대로 출력된 것을 확인할 수 있다
3.4 데이터 조회하기
SELECT문과 INSERT문으로 DB에 저장된 데이터를 조회하고 삽입하기를 연습해보자!
3.4.1 H2 DB 접속하기
3.4.2 데이터 조회하기
SELECT 속성명 FROM 테이블명;
INSERT INTO 테이블명(속성명1, 속성명2, 속성명3, ...) VALUES(값1, 값2, 값3, ...);
4장 롬복과 리팩터링
4.1 롬복이란
롬복(lombok): 코드를 간소화해주는 라이브러리
-롬복을 사용하면 필수코드를 간편하게 작성할 수 있다
-로깅(logging: 프로그램의 수행 과정을 기록으로 남기는 것)->println()문을 개선 가능
4.2 롬복을 활용해 리팩터링하기
리팩터링: 코드의 기능에는 변함이 없이 코드의 구조 또는 성능을 개선하는 작업
4.2.1 롬복 설치하기
4.2.2 DTO 리팩터링 하기
4.2.3 엔터티 리팩터링 하기
4.2.4 컨트롤러에 로그 남기기
=>롬복을 사용하면 단순한 출력 기능을 로그 시스템으로 바꿀 수 있다
5장 게시글 읽기: Read
5.1 데이터 조회 과정
1.사용자가 데이터를 조회해 달라고 웹페이지에서 URL 요청을 보낸다
2.서버의 컨트롤러가 요청을 받아 해당 URL에서 찾으려는 데이터 정보를 리포지토리에 전달한다
3.리파지토리는 정보를 가지고 DB에 데이터 조회를 요청한다
4.DB는 해당 데이터를 찾아 이를 엔터티로 반환한다
5.반환된 엔터티는 모델을 통해 뷰 템플릿으로 전달된다
6.최종적으로 결과 뷰 페이지가 완성되어 사용자의 화면에 출력된다
5.2 단일 데이터 조회하기
articles/id로 url요청을 했을 때 이를 받아줄 컨트롤러를 만들어보자!
5.2.2 데이터 조회해 출력하기
1.id를 조회해 DB에서 해당 데이터 가져오기
2.가져온 데이터를 모델에 등록하기
3.조회한 데이터를 사용자에게 보여주기 위한 뷰 페이지를 만들고 반환하기
를 해보자!
//name이라는 이름으로 value 객체 추가
model.addAttribute(String name, Object value)
@NoArgsConstructor : 기본 생성자 추가 어노테이션
5.3 데이터 목록 조회하기
이번엔 단일 데이터가 아닌 데이터 목록을 조회해보자!
이번엔 엔터티가 아닌 엔터티의 묶음인 리스트를 반환한다
5.3.1 url 요청받기
5.3.2 데이터 조회해 출력하기
1.DB에서 모든 Article 데이터 가져오기
2.가져온 Article 묶음을 모델에 등록하기
3.사용자에게 보여줄 뷰 페이지 작성하기
이때 findAll()메서드의 데이터 반환타입은 Iterable인데 작성한 타입은 List라서 불일치 오류가 발생한다!
해결방법 1. 캐스팅(형변환)
-캐스팅(casting): 데이터 타입을 변환하는 것
-넓은 범위로 해석: 업캐스팅 <-> 좁은 범위로 해석: 다운캐스팅
List<Article> articles = (List<Article>) articleRepository.findAll();
해결방법 2. articleEntityList의 타입을 findAll() 메서드가 반환하는 타입으로 맞추는 방법
Iterable<Article> articles = articleRepository.findAll();
해결방법 3. findAll()메서드가 Iterable이 아닌 ArrayList를 반환하도록 수정하기
@Override
ArrayList<Article> findAll();
ArticleRepository에 오버라이딩 해주기
-머스테치 문법에 쓴 변수가 데이터 묶음인 경우 내부 코드가 반복된다
'3-1 > [inflearn]스프링입문' 카테고리의 다른 글
스프링부트3 자바 백엔드 9장~11장 (0) | 2024.11.23 |
---|---|
스프링부트3 백엔드 개발 6~8장 (4) | 2024.11.16 |
Part 1 스프링 부트 개요 (6) | 2024.11.02 |
[스프링입문] 섹션7 (6) | 2024.10.12 |
[스프링입문]섹션4~섹션6 (4) | 2024.10.05 |