스프링 부트 개발 입문 3장

Tamszero·2025년 7월 9일

ECC

목록 보기
11/17

3장 - 게시판 만들고 새 글 작성하기

3.1 폼 데이터

폼 데이터란? HTML 요소인 <\FORM> 태그에 실려 전송되는 데이터.
폼 태그에 데이터를 전송할 때는 어디로, 어떻게 보낼지 등을 적어 보낸다.
폼 태그에 실어 보낸 데이터 -> 서버의 컨트롤러가 객체DTO에 담아 받음.

DTO -> 폼 데이터를 받는 객체, DTO로 받은 데이터는 최종적으로 DB에 저장된다.

3.2 폼 데이터 DTO로 받기

  • 입력 폼 만들기
    1. /templates에 articles 경로 생성, new.mustache파일 만들기
    2. 아래 폼 코드 작성
    3. ArticleController 컨트롤러 생성후 아래 코드 작성
  • 폼 데이터 전송하기

    action : URL 연결 주소를 적어 해당 페이지로 폼 데이터를 보낸다는 의미
    method : 속성 값으로 get과 post 2가지를 설정할 수 있다.

    아래와 같이 new.mustache 코드 수정, 여기서는 method를 post방식으로 설정하였다.

  • 폼 데이터 받기
    아래와 같이 ArticleController에 메서드 추가. 뷰 페이지에서 폼 데이터를 post 방식으로 전송했으므로 컨트롤러에서 받을 때도 @PostMapping()을 통해 받는다
  • DTO 만들기

    	1. com.example.firstproject 경로에 새로운 패키지 dto 만들기
    1. 여기에 새로운 자바 클래스 파일 ArticleForm 생성 -> 이게 DTO가 되는 것
    2. title과 content 필드 선언
    3. 각 필드의 생성자 추가, toString()추가
  • 폼 데이터를 DTO에 담기
    ArticleController 파일 코드 수정
    폼 데이터를 DTO로 받을 수 있도록 매개변수를 ArticleForm으로 받아온다.
    DTO에 폼 데이터가 잘 담겼는지 확인할 수 있도록 출력

  • 입력 폼과 DTO 필드 연결
    new.mustache 파일의 코드를 DTO의 필드와 연결할 수 있도록 각 필드명을 지정해준다

  • 서버를 재시작하고 제목, 내용을 작성하고 submit -> 콘솔창에 데이터가 들어온 모습

3.3 DTO를 데이터베이스에 저장하기

이제는 폼 데이터를 DB에 저장해보자
처음 프로젝트를 만들 때 추가한 H2 DB를 사용할 것이다.

JAP란?
DB에 자바 언어로 명령을 내릴 수 있도록하는 도구.
이것도 프로젝트를 만들 때 추가했음.
JAP의 핵심 도구로는 엔티티와 리파지터리가 있다.

  • 엔티티 : 자바 객체를 DB가 이해할 수 있도록 만든 것. 이를 기반으로 테이블이 만들어짐.
  • 리파지터리 : 엔티티가 DB 속 테이블에 저장 및 관리될 수 있게하는 인터페이스이다.

DTO를 DB에 저장하는 과정

DTO를 엔티티로 변환하기

form 객체의 toEntity()라는 메서드를 호츌해서 그 반환값을 Article 타입의 article 엔티티에 저장한다. -> 이제 Article 클래스와 toEntity()메서드를 만들어줘야함

1. Article 클래스 만들기
Article에 마우스를 올리고 Alt+Enter을 눌러 create class 'Article'을 선택.
이때 패키지 생성 위치를 com.example.firstproject.entity라고 수정하고 만들어준다.
-> 그러면 기본 패키지 아래에 entity 패키지가 만들어졌고, 내부에 Article 클래스가 있음

  • @Entity 선언 -> DB에 테이블이 생성됨
  • title, content 필드 선언, @Column 붙임 -> 두 필드가 DB 테이블의 각 열과 연결
  • 대푯값으로 id를 선언, @Id 붙임 -> 자동으로 대푯값을 생성해줌
  • Article의 객체 생성 및 초기화를 위해 생성자를 추가해주고, toString 메서드도 추가해줌

2. toEntity() 메서드 추가하기
이 메서드는 DTO인 form 객체를 엔티티 객체로 변환하는 역할을 한다
아티클 클래스를 만든것과 비슷하게 create method 'toEntity' in 'ArticleForm'을 클릭하여 DTO클래스의 ArticleForm에 toEntity()메서드 생성

  • 생성자를 확인해보면 id,title,content를 매개변수로 받고있다 -> 아직 ArticleForm 객체에 id 정보는 없으므로 null, title, content로 전달값을 입력해준다.

리파지터리로 엔티티를 DB에 저장하기

  1. articleRepository.save()메서드를 호출해 article 엔티티를 저장한다.
    -> 리파지터리 만들어줘야함
  2. 필드 선언부에 ArticleRepository 타입의 articleRepository 객체 선언

리파지터리 만들기
ArticleRepository 인터페이스를 통해 리파지터리를 만들자.
1. 프로젝트 탐색기의기본 패키지에 repository 패키지 추가 -> com.example.firstproject.repository
2. 패키지 내에 인터페이스 클래스 ArticleRepository 생성
3. CrudRepository<T, ID> 를 상속받아 구현한다
4. Crud리파지터리는 JPA에서 제공하며 엔티티를 관리(생성,조회,수정,삭제)할 수 있음
이는 2개의 제네릭 요소를 받는다.
- Article: 관리 대상 엔티티의 클래스 타입
- Long: 관리 대상 엔티티의 대푯값 타입

5. ArticleController에 import com.example.firstproject.repository.ArticleRepository를 함

이제 리포지토리의 별도 정의 없이 Crud가 제공하는 기능을 사용 가능, save 메서드도 사용 가능

객체 주입하기
스프링 부트가 제공하는 자동 객체 생성을 사용하기 위해 ArticleController에 @Autowired 어노테이션을 붙인다. -> 스프링 부트가 만들어 놓은 객체를 가져와서 주입해줌 이를 의존성 주입이라고 한다.

  • 데이터 저장 확인하기

3.4 DB데이터 조회하기

현재 Article 테이블의 구성

  • H2 DB에 접속하기
    src>main>resource> application.properties라는 파일로 가서
    H2 DB에 웹 콘솔로 접속할 수 있는 설정인
    spring.h2.console.enabled=true 라는 코드를 추가하여 저장해준다
    그 후 웹 브라우저에서 localhost:8080/h2-console 로 접속하면 됨

    이때, JDBC의 URL 값을 넣어줘야 하는데 H2 DB는 메모리에서 동작하므로 서버가 재시작 할때마다 바뀜. -> run 탭에서 ctrl+f를 눌러 JDBC를 검색하고 그 URL주소를 복사해 웹 브라우저에 붙여 넣어 connect해준다

마무리 정리

  • 폼 데이터를 DTO로 받기
    1. 뷰 페이지 만들기 (클라이언트)
    2. 컨트롤러 만들기 (서버)
    3. 폼 데이터를 담을 객체 DTO 만들기 (서버)
    4. 데이터를 전송받아 DTO에 담기 (서버)
  • DTO를 DB에 저장하기

    컨트롤러가 DTO에 폼 데이터를 받으면 이 DTO를 엔티티로 변환한 후 -> 리파지터리를 이용하여 이 엔티티를 DB에 저장한다

    	이때 외부 객체를 자동으로 필요한 곳에 가져오는 법 -> **Autowired**

셀프체크 - 회원가입 페이지 만들기

  1. 먼저 뷰 페이지 만들기
    templates/members/new.mustache 에 주어진 코드 작성
    이때 이미 email,password 필드가 name으로 연결이 되어있음.
    -> 필요한 필드는 email,password 두개임
    또, action="/join" 이라고 되어있으니, PostMapping 주소를 /join으로 해주어야함
  2. 이제 뷰 페이지를 넘겨줄 컨트롤러 만들기
    controller/MemberController 생성
    • 먼저 @Controller 선언해주기
    • 그 다음 @GetMapping("/members/new")을 통해 URL 받기, 메서드 리턴값도 "members/new"로 작성하여 템플릿 넘겨주기
    • 그 다음 post방식으로 넘어오는 폼 데이터를 받아줘야 하므로 @PostMapping("/join") 선언
    • DTO및 엔티티 처리할 메서드 생성, 매개변수는 DTO타입인 MemberForm
    • 위 메서드에 미리 DTO를 엔티티로 변환한 부분, 리퍼지토리로 엔티티 저장할 부분 주석 만들어주기
  3. 이제 DTO 만들어주기
    dto/MemberForm 생성
    • 필드 두개 선언해주고, 생성자, toString(필요하면) 만들어주기
    • 마지막에 엔티티로 변환하기 위한 메서드 만들어주기, 리턴값은 엔티티Member(null, email, password)
  4. 이제 엔티티 만들어주기
    entity/Member생성
    • 여기에 대푯값 id 타입 Long으로 선언 + (이 위에 @Id, @GeneratedValue)
    • @Column으로 email,password 선언
    • 모든 변수 생성자, toString 만들어주기
  5. 이제 리파지토리 만들어주기
    repository/MemberRepository생성
    • CrudRepository 상속받기 <\Member -> 엔티티 타입, Long -> 대푯값 타입>
  6. 다시 MemberController로 돌아와서
    • @Autowired 달고 MemberRepository 객체 선언해주기 -> 알아서 객체 생성한거 연결해줌
    • //DTO를 엔티티로 변환하기 -> Member(엔티티) member = form(엔티티 객체).toEntity()
    • //리퍼지토리로 엔티티 저장 -> Member(엔티티) saved = memberRepository(리퍼지토리 객체).save(member 엔티티 객체)
profile
공부로그

0개의 댓글