@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;
}
}

주소에 데이터를 담아서 보낸다.
데이터 형태는 key=value이다.
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를 사용해야된다.
통일 : 자바스크립트로 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 데이터를 파싱해서 받아주는 일을 하는데{
"username":"ssar",
"password":"1234"
}
이런 데이터는 스프링이 파싱해서 오브젝트로 받지 못한다.
그래서 @RequestBody 어노테이션을 붙이면 MessageConverter 클래스를 구현한 Jackson 라이브러리가 발동하면서 json 데이터를 자바 오브젝트로 파싱하여 받아준다.
PostMapping("/home")
public String home(@RequestBody User user){
return "home";
}
form 태그로 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>
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);
}