[Springboot] 6 DB에 값 저장하기 (블로그 글 작성)

김호정's avatar
Aug 18, 2024
[Springboot] 6 DB에 값 저장하기 (블로그 글 작성)
 

1. BoardRepository 생성

 
💡
Repository
 
 
notion image
 
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에 떠있다. ( 애는 스프링이 띄워놓은 것 )

판서 설명

 
notion image
 
 
  • A 와 C 에 @Repository 어노테이션 붙임
  • List 에 a, c, em 이 등록되고,
  • heap 에도 A, C, IoC List 가 생성됨
  • IoC 에 등록된 애들은 @Autowired 로 꺼내서 사용
 
 
notion image
 
  • 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 요청에는 커밋되기 전 데이터(트랜잭션이 종료되기 전 데이터)를 보여준다.
데이터 베이스마다 설정된게 다르지만 일반적으로 트렌젝션이 끝나기 전에 요청이 들어오면 커밋되기 전 데이터를 보여준다.
 
트렌젝션이 파괴되면 롤백 한다.
 
디비에 변경 요청하기 전에는 무조건 트렌젝션 걸어줘야한다!
 
  1. 트렌젝션 파괴되면 롤백된다.
  1. 트랜젝션이 시작되면 고립성이 시작된다. 동시에 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이 끝나기전에는 이 데이터가 안보인다. }
 
notion image
 
Jakarta 가 아닌 springFrameWork 의 Transactional 을 붙여줘야 한다.
 
 
Share article

keepgoing