4. 스프링부트(블로그만들기) 글쓰기 기능 추가

윤주헌's avatar
Aug 18, 2024
4. 스프링부트(블로그만들기) 글쓰기 기능 추가

1. 글쓰기

1.1 보드 폴더에 보드 리포지토리 클래스 생성

notion image

1.1.1 @Repository 치기

연습 IoC 컨테이너에 넣어진 거 확인

notion image
재 실행 → 실행됨(이게 new 된 거임 heap에 뜬거임)
notion image
@Repository 주석처리 하면 안 나옴
파라미터에 int n1을 넣으면
notion image
터짐
notion image
int라는 bean이 필요한데 없데..
이거 왜 했지?
 

어노테이션 레파지토리 쓰는 이유

💡
@Repository 하면 new되고 IoC에 뜬다
 
  • 이것만 기억해
    • @Repository를 붙이면 스프링이 new를 해서 IoC(컬렉션 List 자료형 같은것)에 저장한다 우리가 new하는게 아니고 스프링이 스스로 new한다
      notion image
      ABC있는데 A,C에만 @R붙혀주고 start(검사)하면 스캔함 @R붙어있는애들 new함 A a = new A() C c = new C() 두 개 만듬 → list자료형 하나를 만듬 →
      하나씩 칸이 있는데 따로Heap공간이 있는데 여기에 A객체, C객체, list가 뜬다.
      List도Heap공간안에 → 뜬다. List공간을 IoC라 하고 A를 가르치는 변수 a를 List공간에 저장
      list a 공간에는 A가 있는 주소(레퍼런스 주소 AC)를 적는다
       
  • 왜 list에 주소 띄울까?
💡
꺼내쓰기 쉽게 여기서 관리해준다.
 
notion image
💡
IoC에서 (무언가)em을 꺼내고 싶으면 @Autowired하면 가져올 수 있다.
List에 EntityManager도 들어가 있다.

동작 구조@

🪥
동작 구조 설명

여기까지 수정 아직 인블로그 수정 안함

1.2 보드리포지토리 클래스 내용

 
  • 변경사항 있음 !! insert into board_tb(title, content) 여기에 create_at에서 → created_at 으로 변경@@@@@@
 
notion image
em이 받아줄거임

코드

package shop.mtcoding.blog.board; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @Repository public class BoardRepository { //2. IoC에 있는 객체를 찾아온 @Autowired //1. private EntityManager em; public BoardRepository() { System.out.println("BoardRepository 생성자"); } //책임 -> insert 메서드 책임이 2개면 안좋다!쓰기 힘듬 3. public void save(String title, String content) { Query query = em.createNativeQuery("insert into board_tb(title, content, created_at) values(?,?,now())"); query.setParameter(1, title); query.setParameter(2, content); query.executeUpdate(); } }

추가 설명@

트랜잭션 설명

즉 아직 트랜잭션이 안 걸려 있다

notion image
트랜잭션 걸어주자!!
💡
@ Transactional

테스트 이유!

notion image
레파지토리에 레이어 만듬 테스트 하려면 클라이언트, controller 제외하고 뒤에 부터 테스트 해본다
그래야 레파지토리 전까지는 이상이 없다는 것을 확인하고 안심하고 컨트롤러에서만 신경을 쓸 수 있다.
 

1.3 테스트 페이지 만들기

  • 테스트 페이지 사용 이유
💡
분리해서 테스트 해야지 어디가 문제인지 확인 할 수 있다
 
  • 컨벤션(꼭 지켜야할 약속)
💡
테스트 클래스는 클래스명 뒤에 Test를 붙인다
 
테스트 폴더의 shop.mtcoding.blog 폴더에 board 패키지를 만들어 주고 BoardRepositoryTest 클래스를 만들어 주자
 
notion image
notion image

테스트에 필요한 어노테이션

notion image
  • @SpringBootTest
💡
C, R, h2 등 모든 레이어를 메모리에 다 올리고 테스트할 때 사용하는 어노테이션 인데 우리는 래파지토리만 검사할 거니까 지금은 필요 x
  • 레이어
💡
레이어 → Controller, 레파지토리 같은 것 하나 하나를 의미한다
그래서 필요한 것만 띄운다
notion image
 
  • @DataJpaTest
💡
h2, em
  • @Import(BoardRespository.class)
💡
br을 띄운다 다른거 안 뜬다

IoC에서 br 가지고 오기

notion image
 
  • 엔티티 메니저 필요 없어서 지움
notion image

테스트 given, when, eye 설명

  • 테스트 메서드 컨밴션(약속)
💡
메서드명_test 를 붙인다
  • 테스트 메서드특징
💡
매개변수를 사용할 수 없다
  • given
💡
매개변수를 강제로 만든다
  • when
💡
여기서 테스트한다
  • eye
💡
눈에 보이는 것 System.out.println(); 같은 것
 

1.3.1 save_test 메서드 테스트에 적을 코드

  • 테스트 할 메서드 위에 @Test 어노테이션을 붙이자!
notion image

오류발생1@

🪐
상황 및 해결

1.3.2다시 진행

  • save_test를 > 실행하면
notion image
 
만약 title에 null 이 들어간다면 → null 허용함
notion image
 

테스트 실행시 오류가 났을 때

 
  1. 레파지토리에서 임의로 보드 이름을 바꾸면
notion image
테이블을 못 찾는다
에러에서부터 찾아봐야 한다
notion image
보드가 t? 보드명을 잘못 적었구나 확인
 
  1. 컬럼명 틀려봄
notion image
테스트 해보니까 컬럼이 titl이네?
notion image
 

공부 방법

단순 반복 → 한줄씩 지우고 넣으면서 분석 → 이론적 분석→ 깊게 들어가야 한다
 

화면

상단부 재생 옆쪽을 블로그 어플리케이션으로 바꿔줘야 함
notion image

1.4 save-form 머스테치 수정

notion image
 

1.4.1 폼 태그는 get이기 때문에 post로 변경

notion image
notion image
  • 주석 방법
💡
컨트롤 쉬프트 / 하면 주석처리 해줌
  • application/x-www-form-rulencoded?
💡
key = value & key = value 이런 타입이다
 

1.5 컨트롤러로 이동

response.sendRedirect("/board") 예전에 이렇게 함

1.5.1 save 메서드 만들기(글쓰고 저장하는 기능)

하지만 지금은 redirect:/board 로 해줌
notion image

1.5.2 name 값 받아야지

매개변수로 바로 받을 수 있다.
notion image
  • 가지고 오는 것들
notion image
 

1.5.3 BoardRepository에서 save 메서드 실행 IoC에 있는 값

IoC에 있는거 가지고 와야해서
notion image
인서트 되고 리다이랙트 해주고 다른 화면 보여줌

오류 2@

🚨
오류난 것

넣어보자

notion image
 
notion image
h2 DB 가서 확인
localhost:8080/h2-console
notion image
 

혹여나 보이지 않는다면 DB 쿼리문을 확인해보자

notion image
 
 

마지막 정리

할 수 있어야 있는게 있다
하나 하나 하면서 태스트 해보자!!

연습(테이블 이름 및 변수 이름 변경 해서 실행해보기)

  1. 테이블명을 post_tb로 변경
notion image
 
  1. title→ subtitle(변수명)로 변경
notion image
  1. content → postContent(변수명)로 변경 post_content로 변경된다 확인해봐라 폼, insert
notion image

글쓰기 잘 동작되는지 확인

1. form태그에 name값 변경 스태틱에 있는 파일 삭제( 삭제 해야지 사이트 들어갈 때 혹시나 .html로 안 들어 가니까) key value가 틀려서 오류남
notion image
notion image
 
아래 콘솔 clearAll해주고 태스트 해주자
notion image
하나 하나 바꾸면서 태스트 해야 한다!!
보드가 문제다 → 타이틀이 문제다 컬럼 post_content 해줘야 한다
만약 postContent로 했다면 테스트 확인 sql에는 뭐가 있는지 확인하고
notion image
 
전부 컬럼 바꾸고 확인해보니
h2 가니까
 
notion image
null 뜬다
 
그래서 제약조건을 줘야한다 애초에 null이 들어가면 안된다
 
notion image
notion image
이제 레파지토리 test에 가서 null 넣고 터지는지 확인
💡
null 넣을 때 “” 쌍 따옴표 지워주자
notion image
이제 화면가서 save-form에 값 넣기 테스트 해보자
 
notion image
 
클라이언트에서 controller가 값을 재대로 못 받고 있다 키 값이 달라서 null이 뜬다
결국 레파지토리에서는 문제 없고, DB에서도 문제가 없다
name 바꿔주자
notion image
 
 
notion image
  1. Controller에 매개변수 변경
  1. Reopsitory의 쿼리 변경
 
 
다시
1. 테이블명을 board_tb
2. title <- subtitle (엔티티 변수명)
3. content <- postContent(엔티티 변수명)
4. 글쓰기가 잘 동작하게 하기
(1) form태그에 name값을 변경
(2) Controller에 매개변수 변경
(3) Repository의 쿼리 변경
연습하자
 
 
어노테이션 리플랙션에 대해 오후에 알아보자
 
 
어제 이어서

버튼 누르면 .html 로 가는거 변경

 
Share article

code-sudal