1. 글쓰기
1.1 보드 폴더에 보드 리포지토리 클래스 생성

1.1.1 @Repository 치기
연습 IoC 컨테이너에 넣어진 거 확인

재 실행 → 실행됨(이게 new 된 거임 heap에 뜬거임)

@Repository 주석처리 하면 안 나옴
파라미터에 int n1을 넣으면

터짐

int라는 bean이 필요한데 없데..
이거 왜 했지?
어노테이션 레파지토리 쓰는 이유
@Repository 하면 new되고 IoC에 뜬다
- 이것만 기억해
@Repository를 붙이면 스프링이 new를 해서 IoC(컬렉션 List 자료형 같은것)에 저장한다 우리가 new하는게 아니고 스프링이 스스로 new한다

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에 주소 띄울까?
꺼내쓰기 쉽게 여기서 관리해준다.

IoC에서 (무언가)em을 꺼내고 싶으면 @Autowired하면 가져올 수 있다.
List에 EntityManager도 들어가 있다.
동작 구조@
동작 구조 설명여기까지 수정 아직 인블로그 수정 안함
1.2 보드리포지토리 클래스 내용
- 변경사항 있음 !! insert into board_tb(title, content) 여기에 create_at에서 → created_at 으로 변경@@@@@@

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();
}
}
추가 설명@
트랜잭션 설명즉 아직 트랜잭션이 안 걸려 있다

트랜잭션 걸어주자!!
@ Transactional
테스트 이유!

레파지토리에 레이어 만듬 테스트 하려면 클라이언트, controller 제외하고 뒤에 부터 테스트 해본다
그래야 레파지토리 전까지는 이상이 없다는 것을 확인하고 안심하고 컨트롤러에서만 신경을 쓸 수 있다.
1.3 테스트 페이지 만들기
- 테스트 페이지 사용 이유
분리해서 테스트 해야지 어디가 문제인지 확인 할 수 있다
- 컨벤션(꼭 지켜야할 약속)
테스트 클래스는 클래스명 뒤에 Test를 붙인다
테스트 폴더의 shop.mtcoding.blog 폴더에 board 패키지를 만들어 주고 BoardRepositoryTest 클래스를 만들어 주자


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

- @SpringBootTest
C, R, h2 등 모든 레이어를 메모리에 다 올리고 테스트할 때 사용하는 어노테이션 인데 우리는 래파지토리만 검사할 거니까 지금은 필요 x
- 레이어
레이어 → Controller, 레파지토리 같은 것 하나 하나를 의미한다
그래서 필요한 것만 띄운다

- @DataJpaTest
h2, em
- @Import(BoardRespository.class)
br을 띄운다 다른거 안 뜬다
IoC에서 br 가지고 오기

- 엔티티 메니저 필요 없어서 지움

테스트 given, when, eye 설명
- 테스트 메서드 컨밴션(약속)
메서드명_test 를 붙인다
- 테스트 메서드특징
매개변수를 사용할 수 없다
- given
매개변수를 강제로 만든다
- when
여기서 테스트한다
- eye
눈에 보이는 것 System.out.println(); 같은 것
1.3.1 save_test 메서드 테스트에 적을 코드
- 테스트 할 메서드 위에 @Test 어노테이션을 붙이자!

오류발생1@
상황 및 해결1.3.2다시 진행
- save_test를 > 실행하면

만약 title에 null 이 들어간다면 → null 허용함

테스트 실행시 오류가 났을 때
- 레파지토리에서 임의로 보드 이름을 바꾸면

테이블을 못 찾는다
에러에서부터 찾아봐야 한다

보드가 t? 보드명을 잘못 적었구나 확인
- 컬럼명 틀려봄

테스트 해보니까 컬럼이 titl이네?

공부 방법
단순 반복 → 한줄씩 지우고 넣으면서 분석 → 이론적 분석→ 깊게 들어가야 한다
화면
상단부 재생 옆쪽을 블로그 어플리케이션으로 바꿔줘야 함

1.4 save-form 머스테치 수정

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


- 주석 방법
컨트롤 쉬프트 / 하면 주석처리 해줌
- application/x-www-form-rulencoded?
key = value & key = value 이런 타입이다
1.5 컨트롤러로 이동
response.sendRedirect("/board")
예전에 이렇게 함1.5.1 save 메서드 만들기(글쓰고 저장하는 기능)
하지만 지금은 redirect:/board 로 해줌

1.5.2 name 값 받아야지
매개변수로 바로 받을 수 있다.

- 가지고 오는 것들

1.5.3 BoardRepository에서 save 메서드 실행 IoC에 있는 값
IoC에 있는거 가지고 와야해서

인서트 되고 리다이랙트 해주고 다른 화면 보여줌
오류 2@
오류난 것넣어보자


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

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

마지막 정리
할 수 있어야 있는게 있다
하나 하나 하면서 태스트 해보자!!
연습(테이블 이름 및 변수 이름 변경 해서 실행해보기)
- 테이블명을 post_tb로 변경

- title→ subtitle(변수명)로 변경

- content → postContent(변수명)로 변경 post_content로 변경된다 확인해봐라 폼, insert

글쓰기 잘 동작되는지 확인
1. form태그에 name값 변경
스태틱에 있는 파일 삭제( 삭제 해야지 사이트 들어갈 때 혹시나 .html로 안 들어 가니까)
key value가 틀려서 오류남


아래 콘솔 clearAll해주고 태스트 해주자

하나 하나 바꾸면서 태스트 해야 한다!!
보드가 문제다 → 타이틀이 문제다
컬럼 post_content 해줘야 한다
만약 postContent로 했다면
테스트 확인 sql에는 뭐가 있는지 확인하고

전부 컬럼 바꾸고 확인해보니
h2 가니까

null 뜬다
그래서 제약조건을 줘야한다 애초에 null이 들어가면 안된다


이제 레파지토리 test에 가서 null 넣고 터지는지 확인
null 넣을 때 “” 쌍 따옴표 지워주자

이제 화면가서 save-form에 값 넣기 테스트 해보자

클라이언트에서 controller가 값을 재대로 못 받고 있다 키 값이 달라서 null이 뜬다
결국 레파지토리에서는 문제 없고, DB에서도 문제가 없다
name 바꿔주자


- Controller에 매개변수 변경
- Reopsitory의 쿼리 변경
다시
1. 테이블명을 board_tb
2. title <- subtitle (엔티티 변수명)
3. content <- postContent(엔티티 변수명)
4. 글쓰기가 잘 동작하게 하기
(1) form태그에 name값을 변경
(2) Controller에 매개변수 변경
(3) Repository의 쿼리 변경
연습하자
어노테이션 리플랙션에 대해 오후에 알아보자
어제 이어서
버튼 누르면 .html 로 가는거 변경
Share article