Schedule, 그 전에 밀린 TIL 쓰기
오늘도 역시 수정한 부분만 짤라서 올려보겠습니다.
// 전체 일정 조회
@GetMapping
public ResponseEntity<List<ScheduleResponseDto>> findAllSchedules(@RequestBody ScheduleRequestDto dto){
return new ResponseEntity<>(scheduleService.findAllSchedules(dto),HttpStatus.OK);
}
List<ScheduleResponseDto> findAllSchedules(ScheduleRequestDto dto);
// service) 일정 목록 조회 메서드
@Override
public List<ScheduleResponseDto> findAllSchedules(ScheduleRequestDto dto) {
return scheduleRepository.findAllSchedules(dto.getName(),dto.getModificationdate());
}
List<ScheduleResponseDto> findAllSchedules(String name, String modificationdate);
// repository) 일정 목록 조회 메서드
@Override
public List<ScheduleResponseDto> findAllSchedules(String name, String modificationdate) {
if (name==null && modificationdate==null) {
return jdbcTemplate.query("select * from schedule order by modificationdate desc", scheduleRowMapper());
}else if (name== null) {
return jdbcTemplate.query("select * from schedule where modificationdate like ? order by modificationdate desc",
scheduleRowMapper(),modificationdate+"%");
}else if (modificationdate== null) {
return jdbcTemplate.query("select * from schedule where name=? order by modificationdate desc",
scheduleRowMapper(),name);
}else{
return jdbcTemplate.query("select * from schedule where name=? and modificationdate like ?" +
"order by modificationdate desc", scheduleRowMapper(),name,modificationdate+"%");
}
}
private String modificationdate;
// annotation 삭제
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
일정 목록 조회
수정일(형식 : YYYY-MM-DD)
작성자명
조건 중 한 가지만을 충족하거나, 둘 다 충족을 하지 않을 수도, 두 가지를 모두 충족할 수도 있습니다.
System.out.println();을 사용하여 Console에 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용하여 로그를 출력 # com.example.springbasicannotation 하위 경로들의 로그 레벨을 설정
logging.level.com.example.springbasicannotation=TRACE <-
Annotation 기반의 Spring에서 Controller(Handler)를 만들 때 사용하는 어노테이션
@Indexed특정 URL로 Request를 보내면 들어온 요청을 Controller 내부의 특정 Method와 Mapping 하기 위해 사용
Client로부터 요청이 왔을 때 어떤 Controller가 호출될지 Mapping하는 것은 단순히 URL로 Mapping 하는 것이 아니라 여러가지 요소(URL, Method 등)를 조합하여 Mapping함
package com.example.springbasicannotation.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
// 응답 데이터를 반환한다.
@RestController
public class RequestMappingController {
// HTTP Method 는 GET만 허용한다.
@RequestMapping(value = "/v1", method = RequestMethod.GET)
public String exampleV1() {
// logic
return "this is sparta!";
}
}
@PostMapping, @PutMapping, @DeleteMapping, @PatchMapping도 같음❓그럼 실제로는 위 어노테이션들만 사용하고
@RequestMapping은 사용하지 않나요?
위 어노테이션들은 메서드 레벨에서만 가능하지만, @RequestMapping은 클래스 레벨에서도 가능
그래서 @RequestMapping는 prefix로 선언할 URL을 class 레벨에 적용하는 것에 주로 사용
ex) user/{id}
@RequestMapping("/posts")
@RestController
public class PathVariableController {
// postId로 된 post 단건 조회
@GetMapping("/{postId}")
// @PathVariable("postId") Long data -> @PathVariable Long postId로 생략 가능
public String pathVariableV1(@PathVariable("postId") Long data) {
// logic
String result = "PathvariableV1 결과입니다 : " + data;
return result;
}
}
속성 설정을 통하여 특정 헤더, 특정 파라미터와 Mapping 할 수 있음
package com.example.springbasicannotation.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ParameterController {
// parms 속성값 추가
@GetMapping(value = "/users", params = "gender=man")
public String params() {
// logic
String result = "params API가 호출 되었습니다.";
return result;
}
}
속성 작성 규칙
1. params = "gender"
- params의 key값은 커스텀이 가능
- value는 없어도 됨
2. params = "!gender"
- gender가 없어야 함
3. params = "gender=man"
- gender=man 이어야 함
4. params = "gender!=man"
- params의 value값이 man가 아니여야 함
5. params = {"gender=man", "gender=woman"}
- 배열로 속성 값을 여러 개 설정이 가능
@RestController
public class ParameterController {
// headers 속성값 추가
@PostMapping(value = "/users", headers = "Content-Type=application/json")
public String headers() {
// logic
String result = "headers API가 호출 되었습니다.";
return result;
}
}
HTTP Header Content-Type(요청)과 매핑
@RestController
public class ParameterController {
// consumes 속성값 추가
@PostMapping(value = "/users", consumes = "application/json") // MediaType.APPLICATION_JSON_VALUE
public String consumes() {
// logic
String result = "consumes API가 호출 되었습니다.";
return result;
}
}
consumes=”application/json”consumes=”!application/json”consumes=”application/*” consumes=”*\/*”@RestController
public class ParameterController {
// produces 속성값 추가
@GetMapping(value = "/users", produces = "text/plain")
public String produces() {
// logic
String result = "text/plain 데이터 응답";
return result;
}
}
// 로깅
@Slf4j
@RestController
public class RequestHeaderController {
@GetMapping("/request/headers")
public String headers(
HttpServletRequest request, // Servlet에서 사용한것과 같음
HttpServletResponse response, // Servlet에서 사용한것과 같음
@RequestHeader MultiValueMap<String, String> headerMap,
@RequestHeader("host") String host,
@CookieValue(value = "cookie", required = false) String cookie,
HttpMethod httpMethod,
Locale locale
) {
// Servlet
log.info("request={}", request);
log.info("response={}", response);
// @RequestHeader
log.info("headerMap={}", headerMap);
log.info("host={}", host);
// @CookieValue
log.info("cookie={}", cookie);
// HttpMethod
log.info("httpMethod={}", httpMethod);
// Locale
log.info("Locale={}", locale);
return "success";
}
}
Log 출력 결과
Map과 유사하게 Key, Value 형식으로 구현되어 있지만 하나의 Key가 여러 Value를 가질 수 있다 HTTP Header, Reqeust Parameter와 같이 하나의 Key에 여러 값을 받을 때 사용
ex) key1=value1&key1=value2
위의 요구사항으로 조회를 하라는 부분을 다른 식으로 이해하고 작성한 것을 사실 어제 다 만들었다고 생각했는데 팀장님이 이거 구현하셨어요?라는 말에 등골이 오싹해졌다. 이 말을 들은 시각은 대략 11시.. 급하게 수정하고 주석 처리도 같이 하고 api도 다시 써야 하고 read.me도 수정해야 해서 완전 집중해서 최대한 빠르게 만들어서 1시쯤에 제출 완료했다. 😎
결론 : 시간이 사라짐. 좋은 건가?🤔
그리고 오랜만에 밀린 TIL 쓰면서 다시 보니까 더 이해가 되는 것 같아서 좋다. 😁