inblog logo
|
code-sudal
    blog

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

    윤주헌's avatar
    윤주헌
    Aug 18, 2024
    4. 스프링부트(블로그만들기) 글쓰기 기능 추가
    Contents
    1. 글쓰기1.1 보드 폴더에 보드 리포지토리 클래스 생성동작 구조@여기까지 수정 아직 인블로그 수정 안함추가 설명@즉 아직 트랜잭션이 안 걸려 있다테스트 이유!1.3 테스트 페이지 만들기오류발생1@1.4 save-form 머스테치 수정1.5 컨트롤러로 이동오류 2@넣어보자마지막 정리연습(테이블 이름 및 변수 이름 변경 해서 실행해보기)버튼 누르면 .html 로 가는거 변경

    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

    RSS·Powered by Inblog