Spring : restful

지환·2023년 12월 21일

Spring

목록 보기
7/7
post-thumbnail

RestfulController

@RestController
@RequestMapping("/http/*")
public class RestfulController {
    Logger logger = LoggerFactory.getLogger(RestfulController.class);

}

MemberVO

@Data
@NoArgsConstructor
public class MemberVO {
    private int mem_no;
    private String mem_id;
    private String mem_pw;
    private String mem_name;

    @Builder
    public MemberVO(int mem_no, String mem_id, String mem_pw, String mem_name) {
        super();
        this.mem_no = mem_no;
        this.mem_name = mem_name;
        this.mem_id = mem_id;
        this.mem_pw = mem_pw;
    }

}

  1. Get 요청(select시 사용)
  • 주소에 데이터를 담아서 보낸다.

  • 데이터 형태는 key=value이다.

  1. Post,Put,Delete 요청
  • Body에 담아서 보낸다. 데이터의 형태는 json통일한다.

  • put,delete는 자바스크립트로 요청한다.

  • form 태그 요청은 get 요청과 post요청만 가능하다.

[Oracle Table]

create table demo_member(
    mem_no number(5) constraints dmember_no_pk primary key
   ,mem_id varchar2(10) not null
   ,mem_pw varchar2(10) not null
   ,mem_name varchar2(30)  

)

Test1) Get방식

[url]
http://localhost:8000/http/get?mem_id=kiwi&mem_name=키위

이렇게 치면, mem_id=kiwi&mem_name=키위 이 부분이 MemberVO mVO에 담기게된다.

@RestController
@RequestMapping("/http/*")
public class RestfulController {
    Logger logger = LoggerFactory.getLogger(RestfulController.class);

    // 테스트 방법: http://localhost:8000/http/get?mem_id=kiwi&mem_name=키위

    @GetMapping("get")
    public String getTest(MemberVO mVO) {
        return "Get요청" + mVO.getMem_id() + "," + mVO.getMem_name();
    }

Test2) Post방식

[url]

http://localhost:8000/http/post

어떻게 VO을 받아오는가? 에대한 학습목표가 있다.

@RestController
@RequestMapping("/http/*")
public class RestfulController {
    Logger logger = LoggerFactory.getLogger(RestfulController.class);

    // 테스트 방법: http://localhost:8000/http/get?mem_id=kiwi&mem_name=키위

    @PostMapping("post")
    public String getPost(MemberVO mVO) {
        return "Post요청" + mVO.getMem_id() + "," + mVO.getMem_name();
    }

}

파라미터에 @RequestBody가 필요하다면?

{
    "mem_no" :1,
    "mem_id" : "apple",
    "mem_pw": "123",
    "mem_name" : "kiwi"
}
    @PostMapping("post")
    public String postTest(@RequestBody MemberVO mVO) {
        return "post요청  : " + mVO.getMem_id() + ", " + mVO.getMem_name();
    }

파라미터로 받을 때, 저 객체들을 받기 때문에 @RequestBody를 사용해야된다.


  1. Get요청(select할 때 사용함)
    주소에 데이터를 담아 보낸다. 데이터 형태는 key=value
  1. Post, Put, Delete 요청
    Body에 데이터를 담아 보낸다. 데이터 형태는 json으로 통일하는 것이 좋다.
  1. form태그 요청은 get요청과 post요청만 가능함
    put과 delete는 자바스크립트로 요청을 해야 함

통일 : 자바스크립트로 ajax로 요청 + 데이터는 json으로 통일하기

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

스프링 컨트롤러는 key=value 데이터를 자동으로 파싱하여 변수에 담아준다.

가령 get요청은 key=value이고 post요청중에 x-www-form-urlencoded (form태그를 만들어서 데이터 전송) 시에도 key=value 이기 때문에 이러한 데이터는 아래와 같이 함수의 파라메터로 받을 수 있다.

PostMapping("/home")
public String home(String username, String email){
	
    return "home";
}

[스프링 컨트롤러의 파싱 전략 2]
스프링은 key=value 형태의 데이터를 오브젝트로 파싱해서 받아주는 역할도 한다.

이때 주의 할점은 setter가 없으면 key=value 데이터를 스프링이 파싱해서 넣어주지 못한다.

class User {
	private String username;
    private String password;
    
    public String getUsername(){
    	return username;
    }
    
    public String getPassword(){
    	return password;
    }
    
    public void setUsername(String username){
    	this.username = username;
    }
    
    public void setPassword(String password){
    	this.password = password;
    }
    
}
PostMapping("/home")
public String home(User user){
	
    return "home";
}

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

  • json 데이터일반 text데이터는 스프링 컨트롤러에서 받기 위해서는 @RequestBody 어노테이션이 필요하다.
  • 기본전략이 스프링 컨트롤러는 key=value 데이터를 파싱해서 받아주는 일을 하는데
    다른 형태의 데이터 가령 json 같은 데이터는 아래와 같이 생겼다.
{
    "username":"ssar",
    "password":"1234"
}
  • 이런 데이터는 스프링이 파싱해서 오브젝트로 받지 못한다.

  • 그래서 @RequestBody 어노테이션을 붙이면 MessageConverter 클래스를 구현한 Jackson 라이브러리가 발동하면서 json 데이터를 자바 오브젝트로 파싱하여 받아준다.

PostMapping("/home")
public String home(@RequestBody User user){
	
    return "home";
}

form 태그로 json데이터 요청방법

  1. key=value 데이터가 아니라 json데이터를 어떻게 전송할 수 있을까?

join.jsp

<div class="container">

	<form>
		<div class="form-group">
			<label for="username">유저네임</label> 
			<input type="text" id="username">
		</div>
		<div class="form-group">
			<label for="password">패스워드</label> 
			<input type="password" id="password">
		</div>
		
		<div class="form-group">
			<label for="email">이메일</label> 
			<input type="email" id="email">
		</div>
	</form>
	
	<button id="join--submit" class="btn btn-primary">회원가입</button>

</div>

<script src="/js/join.js"></script>
join.js

<script>
$('#join--submit').on('click', function() {
	var data = {
		username : $('#username').val(),
		password : $('#password').val(),
		email : $('#email').val()
	};

	$.ajax({
		type : 'POST',
		url : '/user/join',
		data : JSON.stringify(data),
		contentType : 'application/json; charset=utf-8',
		dataType : 'json'
	}).done(function(r) {
		if (r.statusCode == 200) {
			console.log(r);
			alert('회원가입 성공');
			location.href = '/user/login';
		} else {
			if (r.msg == '아이디중복') {
				console.log(r);
				alert('아이디가 중복되었습니다.');
			} else {
				console.log(r);
				alert('회원가입 실패');
			}
		}
	}).fail(function(r) {
		var message = JSON.parse(r.responseText);
		console.log((message));
		alert('서버 오류');
	});
});
</script>
  • get/post 방식이 다르다.

Lombok을 사용해보자

Test url) http://localhost:8000/http/lombokTest?mem_id="ohjihwan123@naver.com"&mem_name="jihwan"&mem_no=4

    @GetMapping("lombokTest")
    public String lombokTest(MemberVO mVO) {
        MemberVO mVO2 = MemberVO.builder().mem_id(mVO.getMem_id()).mem_name(mVO.getMem_name()).build();
        return "Lombok요청" + mVO.getMem_id() + "," + mVO2.getMem_name()+"||"+mVO2.getMem_no();
    }

0 이나온다 왜? 받아오는 값이 매핑이 제대로 안 되었기 떄문에

4가 출력되도록 고쳐보자.

이 부분을 추가했더니

포인트는 mVO는 파라미터로 값을 받는데, 사용자로부터 입력받은 값을 파싱하여 갖고 있다. 그것을 꺼내보기위해선 위에서 했던 방식으로 풀면된다.

put(사용빈도 낮음)

Test url : http://localhost:8000/http/update/7

    // Test URL : http://localhost:8000/http/update/7
    @PutMapping("update/{id}")
    public MemberVO update(@PathVariable int id) {
        MemberVO membervo = new MemberVO();
        membervo.setMem_id("jihwan");
        logger.info(membervo.toString());
        return membervo;
    }

DELETE 진행

    @DeleteMapping("Delete/{id}")
    public String delete(@PathVariable int no) {
        // @PathVariable값은 상세조회시 나 삭제시 pk값으로 사용된다.
        return String.valueOf(no);
    }
profile
아는만큼보인다.

0개의 댓글