본문 바로가기
개발/Spring

MVC 패턴 - API 설계(2)

by BellOne4222 2024. 2. 17.

요청, 응답 설계

 

Handler Methods

  • Spring Web에서 사용자의 요청(request)를 받아 응답(response)를 리턴하는 메소드
  • 매핑 정보
  • 요청
  • 응답

 

@RequestMapping

• name: 뷰 템플릿에서 식별할 때 쓰는 이름
• value, path: URI 경로
• method: HTTP method (ex: GET, POST PUT PATCH DELETE)
• params: 파라미터 검사
• headers: 헤더 검사
• consumes: 헤더의 Content-Type 검사
• produces: 헤더의 Accept 검사(데이터 타입을 받을 수 있는지?)

 

• @GetMapping
• @PostMapping
• @PutMapping
• @DeleteMapping
• @PatchMapping

 

핸들러 메소드가 받을 수 있는 요청들

  • 메소드 파라미터로 적어 넣을 수 있는 타입들

• ServletRequest, ServletResponse, HttpSession
• WebRequest, NativeWebRequest
• @RequestParam, @PathVariable
• @RequestBody, HttpEntity<B>
• @ModelAttribute, @SessionAttribute, Model, ModelMap
• @RequestHeader, @CookieValue

 

핸들러 메소드가 내보낼 수 있는 응답들

  • 메소드가 리턴 할 수 있는 타입들

• ModelAndView
• String, View
• @ModelAttribute, Map, Model
• @ResponseBody
• HttpEntity<B>, ResponseEntity<B>
• HttpHeaders
• void

 

@RequestParam을 생략 할때와 안할 때의 동작 차이

  • @RequestParam을 생략하면 내부적으로  String이나 Long 같은 타입은 @ReuqestParam으로 취급하고 그 이외에 파라미터는 @ModelAttribute로 취급
  •  HandlerMethodArgumentResolverComposite에서 resolver.resolverArgument를 호출한다.
    여기서 getNamedValueInfo를 호출하는데 최초 namedValueInfo가 없으면 맵에다 put을 해주는데 RequestParamMethodArgumentResolver의 createNamedValueInfo를 호출한다.createNamedValueInfo는 RequestParam 어노테이션을 가져오고 어노테이션 값이 없으면  RequestParamNamedValueInfo를 인자 없이 생성자를 호출한다.
  • 이 resolver는 RequestParamMehtodArgumentResolver타입의 상위 타입인 AbstractNamedValueMethodArgumentResolver의 resolverArgument를 호출한다.
// @Requestparam 생략
@GetMapping("/places")
	public ModelAndView adminPlaces(PlaceType placeType, String placeName, String address){
		Map<String, Object> map = new HashMap<>();
		map.put("placeType", placeType);
		map.put("placeName", placeName);
		map.put("address", address);

		return new ModelAndView("admin/places", map);
	}

 

도메인 설계

// Admin
package com.example.Get_In_Line.domain;

import java.time.LocalDateTime;

import lombok.Data;

@Data
public class Admin {

	private Long id;
	private String nickname;
	private String password;
	private String email;
	private String phoneNumber;
	private String memo;

	private LocalDateTime createdAt; // 생성할때 시간
	private LocalDateTime modifiedAt; // 수정한 시간



}

// AdminPlaceMap
package com.example.Get_In_Line.domain;

import java.time.LocalDateTime;

import lombok.Data;

@Data
public class AdminPlaceMap {
	private Long id;
	private Long adminId;
	private Long placeId;

	private LocalDateTime createdAt; // 생성할때 시간
	private LocalDateTime modifiedAt; // 수정한 시간
}

// Event
package com.example.Get_In_Line.domain;

import java.time.LocalDateTime;

import com.example.Get_In_Line.constant.EventStatus;

import lombok.Data;

@Data
public class Event {
	private Long id;

	private Long placeId;
	private String eventName;
	private EventStatus eventStatus;
	private LocalDateTime eventStartDatetime;
	private LocalDateTime eventEndDatetime;
	private Integer currentNumberOfPeople;
	private Integer capacity;
	private String memo;

	private LocalDateTime createdAt; // 생성할때 시간
	private LocalDateTime modifiedAt; // 수정한 시간

}

// Place
package com.example.Get_In_Line.domain;

import com.example.Get_In_Line.constant.PlaceType;

import lombok.Data;

@Data
public class Place {
	private Long id;

	private PlaceType placeType; // enum 값
	private String placeName;
	private String address;
	private String phoneNumber;
	private String capacity;
	private String memo;

	private String createdAt; // 생성할때 시간
	private String modifiedAt; // 수정한 시간
}

 

 

// EventStatus enum
package com.example.Get_In_Line.constant;

public enum EventStatus {
	PENDING, OPENED, CLOSED, CANCELED, ABORTED
}

// PlaceType enum
package com.example.Get_In_Line.constant;

public enum PlaceType {
	// 공공장소, 스포츠, 레스토랑, 파티
	COMMON, SPORTS, RESTAURANT, PARTY;
}

 

'개발 > Spring' 카테고리의 다른 글

Controller Test  (0) 2024.02.18
ControllerAdvice  (0) 2024.02.17
함수형 프로그래밍  (0) 2024.02.16
MVC 패턴(2) - API 설계  (0) 2024.02.16
MVC 패턴(1) - 요구사항 설계  (0) 2024.02.15