1. BoardRepository 생성
Repository

package shop.mtcoding.blog.board;
import jakarta.persistence.EntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository // @Repository를 붙이면 스프링이 new를 해서 IoC(컬렉션 List자료형 같은거)에 저장한다. - inversion of container
public class BoardRepository {
@Autowired // IoC에 있는 객체를 찾아온다.
private EntityManager em;
public BoardRepository() {
System.out.println("BoardRepository 생성자");
}
}
- 어노테이션(@Repository 등)을 붙이면 IoC 메모리에 객체가 뜬다.
- IoC에 뜬걸 가져오려면 @Autowired 붙이면 된다.
- EntityManager도 IoC에 떠있다. ( 애는 스프링이 띄워놓은 것 )
판서 설명

- A 와 C 에 @Repository 어노테이션 붙임
- List 에 a, c, em 이 등록되고,
- heap 에도 A, C, IoC List 가 생성됨
- IoC 에 등록된 애들은 @Autowired 로 꺼내서 사용

- Controller의 SRP (단일 책임 원칙) 는 클라이언트에게 주소 요청받고 응답하는 것.(클라이언트에게 요청받고 VIEW를 응답)
- 브라우저, 포스트맨, 휴대폰, 키오스크도 모두 클라이언트(사용자)
- 어떤 클라이언트든 상관없이 컨트롤러로 요청가능
- 클라이언트와 컨트롤러 ⇒ 프리젠테이션 계층 (표현 계층)
- 화면에 무언가를 표시하기 위한 계층이라는 뜻 (화면 표현 계층)
- Dao (Data Access Object) ⇒ 데이터베이스에 Read, Write (읽기, 쓰기) 하는 객체
- 데이터베이스랑 붙어서 read, write 하는 애들을 Dao 라고 한다.
- 왜 스프링에서는 Repositoyry 라고 하는가?
- 하나의 서버는 프리젠테이션 계층, 비즈니스 계층, 데이터 베이스가 있는 계층으로 이루어진다.
- Repository의 SRP는 데이터를 Write, Read 하는 것이다.
- Dao 라고 할 수 없는게 다른 서버의 프리젠테이션 계층에다가
- 데이터를 요청할 수 있기 때문
- 아니면 컴퓨터의 하드디스크(hdd) 에 붙어서 데이터를 w 하거나 할 수 있어서 dao 라고 부르지 않고 Repository 라고 부른다.
- 예를 들어) 클라이언트가 날씨데이터를 달라고 요청했는데, html은 그냥 템플릿이고 날씨 데이터가 필요하니 controller 가 Repository 에게 일을 위임한다. Repository 는 어? 우리 DB 에 있는 데이터 아닌데? 하면서 다른 서버의 프리젠테이션 계층에 요청해서 데이터를 달라고 한다.
- 다른 서버의 api 를 요청하는 것이다. 카카오 로그인, 공공데이터 API 등도 다른 서버의 데이터를 요청해 가지고 오는 것이라 할 수 있다.
Model
스프링 MVC 의 M이 바로 Model 이다.
EntityManager 가 Repository에게 전송하는 저 데이터를 모델이라고 한다.
Repository가 Controller에 응답할 때 돌려주는 저 데이터를 모델이라고 한다.
컨트롤러가 클라이언트한테 응답하기 직전에 JSP, Mustache 같은 템플릿 엔진에 model 을 넣어서 응답하는 것이다.
- 화면만 찾아서 응답하는게 VC → 앞전까지 우리가 해본 것
- 데이터가 첨가된 화면을 응답하는게 MVC (→ 템플릿 엔진의 정적 코드 사이에 MODEL을 넣어서 응답)
- 컨트롤러랑 모델만 사용해서 데이터를 응답하는게 MC
트렌젝션 (Transaction)
데이터베이스에 여러명이 write를 하게 되면 프로그램이 꼬이게 된다.
동시성의 문제가 생기게 된다.
그래서 트렌젝션의 개념이 생겨났다.
트렌젝션이 끝나기전에 들어온 read 요청에는
커밋되기 전 데이터(트랜잭션이 종료되기 전 데이터)를 보여준다.
데이터 베이스마다 설정된게 다르지만
일반적으로 트렌젝션이 끝나기 전에 요청이 들어오면 커밋되기 전 데이터를 보여준다.
트렌젝션이 파괴되면 롤백 한다.
디비에 변경 요청하기 전에는 무조건 트렌젝션 걸어줘야한다!
- 트렌젝션 파괴되면 롤백된다.
- 트랜젝션이 시작되면 고립성이 시작된다. 동시에 wirte는 할 수 있는데 동시에 같은행을 건드릴수는없다.
- OLTP 실시간 처리 ⇒ 실시간으로 처리하는건 다 OLTP라고 한다.
주문받고 결제하는 것들. 지금 다 처리해야하는 것들.
- OLAP 대용량 데이터 처리 ⇒ 대용량으로 처리하는 오래 걸리는 것들.
정산 같은 것들.
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;
import org.springframework.transaction.annotation.Transactional;
@Repository // @Repository를 붙이면 스프링이 new를 해서 IoC(컬렉션 List자료형 같은거)에 저장한다. - inversion of container
public class BoardRepository {
@Autowired // IoC에 있는 객체를 찾아온다.
private EntityManager em;
public BoardRepository() {
System.out.println("BoardRepository 생성자");
}
// insert 하기
@Transactional // 변경요청할 때는 transactional을 붙여줘야한다.
public void save(String title, String content) {
Query query = em.createNativeQuery("insert into post_tb(subtitle, post_content, created_at) values(?,?,now())");
query.setParameter(1, title); // position = ?의 순서
query.setParameter(2, content);
query.executeUpdate();
}
// transational이 끝나기전에는 이 데이터가 안보인다.
}

Jakarta 가 아닌 springFrameWork 의 Transactional 을 붙여줘야 한다.
Share article