본문 바로가기

JAVA/Spring

영속성 컨텍스트, json 통신

@Transactional
	@PutMapping("/dummy/user/{id}")
	public User updateUser(@PathVariable int id, @RequestBody User requestUser) {
		System.out.println("id: "+id);
		System.out.println("password: "+requestUser.getPassword());
		System.out.println("email: "+requestUser.getEmail());
		
		User user = userRepository.findById(id).orElseThrow(()->{
			return new IllegalArgumentException("수정에 실패하였습니다.");
		});
		user.setPassword(requestUser.getPassword());
		user.setEmail(requestUser.getEmail());
		
		//userRepository.save(user);
		
		//더티 체킹
		return null;
	}

모든 요청은 컨트롤러에 모이고 응답해주는 방식이며, 요청에는 insert, update, select 등이 있다.

테이블이 있고 데이터가 들어있는 데이터베이스가 있다면 JPA가 들고 있는 영속성 컨텍스트라는 것이 있다. 

만약 INSERT 한다면 내 컨트롤러에서 객체를 하나 만들고 SAVE를 하면 영속성 컨텍스트의 1차 캐시 안에 

객체가 쌓인다. 만들어진 해당 객체로 데이터베이스에 집어 넣는다. 데이터베이스에 3건이 있다면 새로운 4데이터가 생기는 것이다. 1차 캐시에 생겨난 객체를 영속화 되었다고 이야기한다.

영속화 된 객체를 데이터베이스에 밀어넣는 것은 플러쉬(Flush)라고 한다. *플러쉬를 프로그래밍에서는 버퍼를 비운다고 한다. 1차 캐시는 비우지는 않고 그대로 있다

컨트롤러에서 새로 생겨난 4번 객체를 select하면 첫번째로 영속화 되어있는지 확인하고, 영속화 되어있으면 데이터베이스가 아닌 영속성 컨텍스트에 접근하여 데이터를 가져온다.

업데이트하고 싶은 데이터가 있다면 먼저 select해서 해당 데이터를 영속화 시키고 그 오브젝트를 컨트롤러로 들고 와서 값을 변경하고 save를 호출하면 변경된 값과 영속화 된 값을 비교하고 영속화 된 객체에서 업데이트를 시키고 이것을 플러쉬해서 밀어넣으면 데이터베이스의 값이 변경된다. 

 

컨트롤러에는 업데이트라는 함수가 있는데 @Transactional을 걸면 함수 종료시에 자동으로 commit을 한다. 

데이터베이스에 있는 테이블안의 데이터가 1,2,3,4가 있다면 2번 데이터를 영속성 컨텍스트에 가져와서 (1차캐시, 영속화 되었다고 한다) 값을 변경하고 트랜잭션을 종료하면 종료 시에 commit 된다. 그러면 영속화 된 오브젝트가 처음에 있는 오브젝트의 이메일과 변경된 이메일을 비교해서 변경이 된 것을 확인하고 컨트롤러 종료시에 데이터베이스에 밀어넣어 업데이트를 실행한다

*@Transactional하면 트랜잭션이 시작되고, 컨트롤러의 마지막에 return할때 자동 종료된다. 함수 종료시에 자동 commit이 된다.

 

exception 처리

@ControllerAdvice //어디서든 exception이 발생하면 해당 클래스로 들어옴
@RestController
public class GlocalExceptionHandler {

	@ExceptionHandler(value=IllegalArgumentException.class) 
	//IllegalArgumentException이 발생하면 에러를 e에 전달하고 실행된다
	public String handleArgumentException(IllegalArgumentException e) {
		return "<h1>"+e.getMessage()+"</h1>";
	}
}

Json 데이터로 통신하기

1. GET 요청

주소에 데이터를 담아 보내는 것이 GET요청이다.

웹브라우저에 치는 모든 것이 get요청이며 특징은 데이터가 key&value 형태이고 body로 데이터를 담아 보내지 않는다

 

2. POST, PUT, DELETE 요청은 데이터를 변경하는 것이다.

변경하는 요청은 데이터를 담아 보내야 할 것이 많다. 데이터를 보낼 때 보낼 수 있는 방법이

POST는 폼태그의 메소드를 POST 방식으로 보내면 되는데 폼태그는 GET요청이나 POST 요청만 할 수 있다는 한계가 있다. PUT, DELETE 요청을 할 땐 폼태그를 못해서 자바 스크립트로 요청을 해야 한다

또한 폼태그는 전부 KEY&VALUE 형태로만 가능하다는 한계가 있다

post는 폼태그로, delete는 자바스크립트로... 따라서 통일의 필요성이 생긴다.

자바스크립트로 ajax요청을 하고 데이터는 json으로 통일을 하게 된다.

 

스프링 컨트롤러의 파싱 전략

스프링 컨트롤러는 KEY&VALUE 데이터가 날아오면 자동으로 파싱해서 변수에 담아준다.

가령 GET요청은 KEY=VALUE이고 이런 데이터는 파라미터로 받을 수 있는데 스프링은 파싱해서 오브젝트로 받아줄 수 있다.

KEY=VALUE가 아닌 데이터는 어떻게 파싱할까?

EKY&VALUE가 아닌 Json 데이터가 들어오면 @RequestBody 어노테이션을 붙여서 받아야 한다. 그러면 jackson 라이브러리가 발동면서 json데이터를 자바오브젝트로 받아준다.

 

 

 

 

 

 

 

본 강의는 '메타코딩'님의 동영상 강의를 참고하였습니다.

출처 : https://www.youtube.com/playlist?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm