혜야의 코딩스토리

[Spring] @RequestBody / @ResponseBody 어노테이션이란? 본문

꿈 : 멋진 개발자 🧸/Java

[Spring] @RequestBody / @ResponseBody 어노테이션이란?

hyeya_ 2022. 10. 1. 00:07

웹페이지에서 json으로 request한 파라미터들을 java에서 받으려면 java Object로의 변환이 필요하며,
response시에도 java Object에서 json으로 변환이 필요하다. 


이런 작업들을 해주는것이 @RequestBody 와 @ResponseBody 이다. 

컨트롤러에 두 어노테이션을 쓰게 되면 JSON이나 key/value 방식의 xml등으로 송수신 할 수 있다.

@RequestBody : HTTP요청의  body내용을 자바 객체로 매핑하는 역할
@ResponseBody : 자바 객체를  HTTP요청의 body내용으로 매핑하는 역할


 💡 정리

 클라이언트에서 =>서버로 필요한 데이터를 요청하기 위해 json데이터를 요청 본문에 담아서 서버로 보내면
 서버에서는 @RequestBody를 사용하여 HTTP요청 본문에 담긴 값들을 자가 객체로 변환시켜 객체에 저장한다.


 서버에서 => 클라이언트로 응답 데이터를 전송하기 위해 @ResponseBody를 사용하여 
 자바 객체를 HTTP응답 본문의 객체로 변환하여 클라이언트로 전송한다.

 


@RequestBody 예시

 

💡MessageController

package com.example.spring02.controller.message;

import javax.inject.Inject;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.spring02.model.message.dto.MessageDTO;
import com.example.spring02.service.message.MessageService;

@RestController
@RequestMapping("messages/*")
public class MessageController {
	
	@Inject
	MessageService messageService;
	
	@RequestMapping(value = "/")
	public ResponseEntity<String> addMessage(@RequestBody MessageDTO dto){
		
		//ResponseEntity : 리턴 값을 json+에러 메시지를 함께 처리해준다.
		ResponseEntity<String> entity=null;
		try {
			messageService.addMessage(dto);
			entity=new ResponseEntity<>("success",HttpStatus.OK);
		} catch (Exception e) {
			e.printStackTrace();
			entity=new ResponseEntity<>(e.getMessage(),HttpStatus.BAD_REQUEST);
			//ex)400에러 : 상호간 변수가 안맞을 때
		}
		return entity;
	}

}

 

💡MessageServiceImpl  

package com.example.spring02.service.message;

import javax.inject.Inject;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.example.spring02.model.message.dao.MessageDAO;
import com.example.spring02.model.message.dao.PointDAO;
import com.example.spring02.model.message.dto.MessageDTO;

@Service
public class MessageServiceImpl implements MessageService {
	
	//Bean을 2개 이상 주입시 따로처리함. 즉, Inject는 각각 해야함.
	@Inject
	MessageDAO messageDao;
	
	@Inject
	PointDAO pointDao;

	//트랜잭션 처리 대상 method (한 트랜잭션의 연산들은 모두 성공하거나, 반대로 모두 실패된다.)
	@Transactional
	@Override
	public void addMessage(MessageDTO dto) {
		//메시지를 테이블에 저장
		messageDao.create(dto);
		//메시지를 보낸 회원에게 10포인트 추가
		pointDao.updatePoint(dto.getSender(), 10);
	}

	@Override
	public MessageDTO readMessage(int mid) {
		// TODO Auto-generated method stub
		return null;
	}

}

 

💡MessageDAOImpl

package com.example.spring02.model.message.dao;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.example.spring02.model.message.dto.MessageDTO;

@Repository
public class MessageDAOImpl implements MessageDAO {

	@Inject
	SqlSession sqlSession;
	
	@Override
	public void create(MessageDTO dto) {
		sqlSession.insert("message.create", dto);

	}

	@Override
	public MessageDTO readMessage(int mid) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void updateState(int mid) {
		// TODO Auto-generated method stub

	}

}

 

💡 Advanced REST client 프로그램으로 테스트한 결과 success !

 

 

 

 

참고

https://cheershennah.tistory.com/179