자바/자바 입문 공부일지

Spring 공부 일지 02. Path Variable 및 json 데이터 응답 포스트맨으로 확인

Tomitom 2023. 2. 6. 12:49
반응형

 

pom.xml 란? 

스프링 프로젝트에 투입이 되는 다양한 라이브러리가 있습니다. 

내가 만든 스프링 프로젝트에 라이브러리를 적용시켜주는 도구 중 하나가 메이븐입니다. 

즉, 스프링용 외부 라이브러리입니다. 

메이븐에 추가 되었으면 하는 라이브러리가 있을 경우 pom.xml 에 추가를 해줍니다. 

메이븐 기반의 스프링 프로젝트의 의존성 관리 설정 파일입니다. 

 

 

 

의존성 관리 내용들이 태그 형식으로 표현되어 있습니다.

프로젝트 명, 모델 버전, 스프링부트 스타트업 등 프로젝트의 내용들이 태그로 기재되어 있습니다. 

<dependencies> 안의 내용들이 의존성에 대한 내용입니다. 

 

만약 추가하고 싶은 것이 있다면 <dependencies></dependencies> 사이에 기재하여 추가하여 사용합니다. 

 

이제 RestController 를 이용해서 VO 객체를 전달하는 것을 해보겠습니다. 

우선 사람을 표시하는 object 를 생성합니다. 

 

 

 

현재 MemberVO 안은 비어 있습니다. 

 

 

 

이제 직전에 작성했던 TestController 로 갑니다. 

 

package com.myspring.pro29.ex01;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test/*")
public class TestController {
	@RequestMapping("/hello")
	public String hello() {
		return "Hello, Rest!";
	}
	
	@RequestMapping("/member")
	public MemberVO member() {
		MemberVO vo = new MemberVO();
		
		vo.setID("hong");
		vo.setPwd("1234");
		vo.setName("홍길동");
		vo.setEmail("hong@text.com");
		
		return vo;
		
		
	}

}

 

/member 루트 안에서는 memberVO 의 내용을 사용자에게 전달해줍니다. 

return vo ; 로  JSON 형식의 응답을 반환합니다. 

그럼 이제 memberVO 를 작성해볼게요. 

 

package com.myspring.pro29.ex01;


public class MemberVO {
	private String id;
	private String pwd;
	private String name;
	private String email;
	
	
	// 각 속성에 대한 getter/setter 
	public MemberVO() {
		
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	@Override
	public String toString() {
		String info = id+", "+ pwd+", "+ name+", "+ email;
		return info;
	}

}

 

 

 

VO(Value Object) : 데이터를 만들기 위한 클래스를 VO 라고 합니다. 즉, 값을 표현한 클래스(객체) 입니다. 

DTO (Data Transfer Object) : 모델을 표현합니다. 데이터 베이스에 있는 데이터를 표현합니다. 

 

public class MemberVO {

private String id;

private String pwd;

private String name;

private String email;

vo의 속성을 정의해주고 그 아래에는 각 속성에 대한 getter 와 setter 를 설정합니다. 

getter : 속성을 리턴받을 수 있는 것입니다. get(리턴명) 으로 작성합니다. getter 메서드는 obj.propName을 사용해 프로퍼티를 읽으려고 할 때 실행됩니다.

setter : 속성은 설정할 수 있는 것입니다. setter 메서드는 obj.propNAme = value으로 프로퍼티에 값을 할당하려 할 때 실행됩니다.

 

이제 테스트 컨트롤러에서 기능과 매핑을 추가해줍니다. 

 

package com.myspring.pro29.ex01;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test/*")
public class TestController {
	@RequestMapping("/hello")
	public String hello() {
		return "Hello, Rest!";
	}
	
	@RequestMapping("/member")
	public MemberVO member() {
		MemberVO vo = new MemberVO();
		
		vo.setId("hong");
		vo.setPwd("1234");
		vo.setName("홍길동");
		vo.setEmail("hong@text.com");
		
		return vo; // JSON 형식의 응답을 준다. 	
	}
	
    //list 반환
    	@RequestMapping("/membersList")
	public List<MemberVO> listMembers(){
		List<MemberVO> list = new ArrayList<MemberVO>();
		for (int i = 0; i < 10; i++) {
			MemberVO vo = new MemberVO();
			vo.setId("hong"+i);
			vo.setPwd("123"+i);
			vo.setName("홍길동"+i);
			vo.setEmail("hong"+i+"@test.com");
			list.add(vo);
		}
		return list;  // 해당 list를 반환. (JSON 타입으로 매핑이 됩니다.) 
	}
    
    //map 반환
		@RequestMapping("/membersMap")
	public Map<Integer, MemberVO> membersMap(){
		Map<Integer, MemberVO> map = new HashMap<Integer, MemberVO>();
		for (int i = 0; i < 10; i++) {
			MemberVO vo = new MemberVO();
			vo.setId("hong"+i);
			vo.setPwd("123"+i);
			vo.setName("홍길동"+i);
			vo.setEmail("hong"+i+"@test.com");
			map.put(i, vo); // member vo 를 하나씩 채웁니다. 
		}
		return map;   // 해당 map을 반환. (JSON 타입으로 매핑) 
	}
	

}

 

list 는 데이터 하나하나를 선형적으로 쌓는다면, map은 key 와 value 로 구분해서 쌓는다는 차이점이 있습니다. 

 

Path Variable 사용

@PathVariable를 사용하면 브라우저에 요청 URL로 전달한 매개변수를 가져올 수 있습니다. 

매핑을 추가할 때 매핑에 대한 매개변수가 추가됩니다. 

아래 코드를 추가하여 TestController 클래스 안에 삽입해줍니다. 

 

	//매핑을 추가할 때 매핑에 대한 매개변수가 추가됩니다.
	// 브라우저에서 요청 시 {num} 부분의 값이 @PathVariable 로 지정됩니다. 
	@RequestMapping(value="/notice/{num}", method = RequestMethod.GET) 

	// 요청 URL 에서 지정된 값이 num 에 자동으로 할당됩니다. 
	public int notice (@PathVariable("num") int num) throws Exception{
		return num;  // 해당  {num} 경로에는 num 을 반환하는 것으로 기본적인 설정을 해둡니다. 
	}
	
	
	
}

 

즉, 위 코드를 해석하자면 value가 {num}으로 들어왔을 때 요청 처리 메소드는 RequsetMetod.Get 이라고 지정하고, 메소드에다가 Path Variable을 추가해줍니다. {num}은 루트에 포함된 변수입니다. 

이로써 @RequestMapping을 만드는데 num의 값에 따라서 요청을 다르게 처리할 수 있습니다. 

num을 받을 때 중괄호로 포함된 부분은 path Variable 이라고 한다. 경로에 포함된 변수를 받아오겠다는 선언을 매개변수에 추가합니다. 

 

이번에는 request body 로 페이지에 무엇인가를 담아서 보내는 요청을 해보겠습니다. 

마치 검색창에 '고양이' 라고 입력을 했을 때 페이지에서 고양이에 대한 정보를 담아서 출력해주는 것과 같습니다. 

우선 HomeController 클래스를 만들어 줍니다. 

 

 

 

 

 

 

스프링부트는 JSP 사용을 권장하지 않아서 JSP 엔진을 지원하지 않습니다. 

(REST API를 권장하기 때문에 스트링 부트에서 지원을 안합니다.) 

별도의 요청처리를 만들어서 해야합니다. 

그렇기 때문에 다른 VSCode  와 같은 에디트를 활성화 한 뒤 JSONTest.json 파일을 만들어줍니다. 

 

  

Test Controller 에 아래 메소드를 작성합니다. 

 

	
	private static final Logger logger = LoggerFactory.getLogger(TestController.class)
	@RequestMapping(value="/info", method = RequestMethod.POST)
	public void modify(@RequestBody MemberVO vo) {
		logger.info(vo.toString());
	}

 

이제 아까 만들었던 JSON  파일로 돌아가서 작성해줍니다. 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
  
<script src="http://code.jquery.com/jquery-latest.js"></script>  
<script>
  $(function() {
      $("#checkJson").click(function() {
      	var member = { id:"park", 
  			    name:"박지성",
  			    pwd:"1234", 
  			    email:"park@test.com" };
  	$.ajax({
        type:"post",
        url:"http://localhost:8080/test/info",
        contentType: "application/json",
        data :JSON.stringify(member),
     success:function (data,textStatus){
     },
     error:function(data,textStatus){
        alert("에러가 발생했습니다.");
     },
     complete:function(data,textStatus){
     }
  });  //end ajax	

   });
});
</script>
</head>
<body>
  <input type="button" id="checkJson" value="회원 정보 보내기"/><br><br>
  <div id="output"></div>
</body>
</html>

 

crossorigin 오류 : 같은 주소에서 요청과 응답을 처리하려고 하면 보안상의 문제로 차단됩니다. (로컬 호스트에서 로컬 호스트로 보내면 차단이 됩니다.) 

이 때 반응을 확인하기 위해서 포스트맨 어플리케이션을 사용해서 요청 응답을 체크합니다.

포스트맨 어플리케이션은 REST API를 만들거나 활용할 때 REST 기반을 테스트해볼 수 있습니다. 

 

포스트맨 어플리케이션의 사이트는 다음과 같습니다. 

https://www.postman.com/downloads/?utm_source=postman-home

 

 

Download Postman | Get Started for Free

Try Postman for free! Join 20 million developers who rely on Postman, the collaboration platform for API development. Create better APIs—faster.

www.postman.com

 

포스트맨을 열면 상단의 Workspaces 가 있습니다. 

 

 

 

 

 

+ 를 누르고 get 요청으로 아까 요청을 확인했었던 http://localhost:8080/test/member 를 입력해서 확인합니다. 

 

 

이번에는 post로 요청을 바꿔서 info 페이지를 확인합니다. 

 

 

직접 원본 데이터를 적어서 보낼 수 있습니다. 

제이슨 형태의 요청을 body에 적어서 보냅니다. 

 

바디에 다음과 같이 적어줍니다. (제이슨 데이터를 적어주어요) 

{
"id":"park",
"name":"박지성",
"pwd":"1234",
"email":"park@test.com"
}
 
 

이대로 send를 했을 경우 결과로 무언가를 받는 것이 아니라 log로 받게 되어 있습니다.

이렇게 했을 때 스프링의 console 에 반응된 것을 볼 수 있습니다. 

 

 

 

정상적인 처리가 된 것을 확인할 수 있습니다. 

 

 

 
 

 

 

반응형