요청, 응답 설계
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 |