KOSA Spring - REST

채정윤·2025년 4월 22일

Spring

목록 보기
17/25

Representational State Transfer

웹의 자원을 URI로 구분, HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용

→ 자원에 대한 행위를 명확하게 표현하는 아키텍처 스타일

📜 Restful Service 순서

  1. restAPI 설계

  2. json

    @RestController

    @RequestBody

    @PathVariable

  3. Test (postman 사용)


✅ 관련 어노테이션

어노테이션설명
@RestController@Controller + @ResponseBody / 반환값을 JSON/XML 형태로 자동 변환해 클라이언트에 응답. REST API에 적합
@ResponseBodyJava 객체를 JSON 또는 XML로 변환하여 응답 본문에 반환 (단독 사용 가능)
@PathVariableURL 경로에 포함된 변수 값 추출 (예: /user/{id})
@CrossOriginCORS 허용 설정 (다른 도메인에서 요청 허용)
@RequestBodyHTTP Body의 JSON 데이터를 Java 객체로 매핑

예제

SampleVO.java

package org.zerock.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SampleVO {

  private Integer mno;
  private String firstName;
  private String lastName;

}

Ticket.java

package org.zerock.domain;

import lombok.Data;

@Data
public class Ticket {

  private int tno;
  private String owner;
  private String grade;
}

SampleController2.java

...
@RestController
@Log4j
public class SampleController2 {

// 기본형
	@GetMapping("/getSample")
	public SampleVO getSample() {
		return new SampleVO(100, "채", "정윤");
	}
...

✅ 컬렉션 타입 - Collectors.toList

mapToObj → SampleVO → collect(Collectors.toList())

	@GetMapping("/getList")
	public List<SampleVO> getList(){
		return IntStream.range(1, 10).mapToObj(i -> 
					new SampleVO(i, "first"+i, "last"+i))
				.collect(Collectors.toList());
	}

✅ PostMapping - @RequestBody

	// 클라이언트가 서버에게 json을 넘김 - PostMapping
	// 이때 json으로 넘어오는 것을 ticket으로 변환하고 싶다! - (@RequestBody)
	@PostMapping("/ticket")
	public Ticket convert(@RequestBody Ticket ticket) {
		log.info("convert.............." + ticket);
		
		return ticket;
	}

✅ URL 정보 - 중괄호와 @PathVariable

	// url 안에 데이터값을 담아서 전달하고 싶을때는 중괄호로 표현
	// 중괄호 개수만큼 @PathVariable 설정, 어떤 변수에 담을지 설정
	@GetMapping("/product/{cat}/{pid}")
	public String[] getPath(@PathVariable("cat") String cat,
										@PathVariable("pid") int pid) {
		return new String[] {"category: " + cat, " product: " + pid};
	}

✅ ResponseEntity - 데이터+부가 상태메세지

목적사용 예시
상태코드 설정ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid")
성공 응답ResponseEntity.ok(data)
헤더 설정new ResponseEntity<>(body, headers, HttpStatus.OK)
조건부 응답 처리if-else로 다르게 ResponseEntity 리턴
    // ✅ 1. 상태코드만 설정
    @GetMapping("/bad-request")
    public ResponseEntity<String> badRequest() {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid");
    }

    // ✅ 2. 200 OK 성공 응답
    @GetMapping("/ok")
    public ResponseEntity<String> okResponse() {
        return ResponseEntity.ok("Everything is fine!");
    }

    // ✅ 3. 201 Created
    @PostMapping("/created")
    public ResponseEntity<String> createdResponse() {
        String newResource = "New resource created!";
        return new ResponseEntity<>(newResource, HttpStatus.CREATED);
    }

    // ✅ 4. 조건부 응답
    @GetMapping("/user/{id}")
		public ResponseEntity<String> getUser(@PathVariable Long id) {
		    if (id == 1) {
		        return ResponseEntity.ok("User1"); // 200 OK
		    } else {
		        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found"); // 404
		    }
		}

    // ✅ 5. 헤더 포함 응답
    @GetMapping("/with-header")
    public ResponseEntity<String> withHeader() {
        HttpHeaders headers = new HttpHeaders();
        headers.add("Custom-Header", "HeaderValue");
        return new ResponseEntity<>("Hello with header!", headers, HttpStatus.OK);
    }

0개의 댓글