본문 바로가기

백/spring

스프링 기본파싱전략과 json통신

1. Get요청(select)

주소에 데이터를 담아 보낸다. 데이터 형태는 key=value

특징 : body로 데이터를 담아 보내지 않음.

2. Post, Put, Delete 요청(데이터를 변경)

Body에 데이터를 담아 보낸다. 데이터 형태는 json으로 통일하는 것이 좋다.

post의 경우 : form method ="post"로 보내면 됨

그러나 form태그의 한계 : get.post 요청만 가능

Put, Delete  : 자바스크립트로 요청해야됨

그럼 저거두개는 form, 나머지 자바스크립트로 쓰면 로직이 지저분해짐

=> 통일 필요

=>자바스크립트로 ajax요청 + 데이터는 json으로 통일!

태그라이브러리를 사용해서 <form:form>태그를 사용하면 delete, put도 가능하긴한데

통일하는게 더 낫다.

 

3. 스프링 컨트롤러의 파싱 전략 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";
}

4. 스프링 컨트롤러의 파싱 전략 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";
}

5. 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";
}

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

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>

각 입력칸마다 id를 달아주고

join.js

<script>
$('#join--submit').on('click', function() {
	var data = {
		username : $('#username').val(),
		password : $('#password').val(),
		email : $('#email').val()
	};
    
    id의 값을 받아와서 ajax 로 전송

	$.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>

 

' > spring' 카테고리의 다른 글

스프링부트의 트랜잭션, 스프링 jpa의 osiv전략  (0) 2023.08.01
스프링 시큐리티 2- ng처리  (0) 2023.07.12
스프링 시큐리티 1  (0) 2023.07.11
파일 업로드 부터 수정까지  (0) 2023.06.28
트랜잭션이란!??!?!!?!??!  (0) 2023.06.22