TIL- Spring 입문주차 과제
Spring 입문주차 과제
@RestController
는 Spring Framework에서 사용되는 애노테이션으로, 해당 클래스가 RESTful 웹 서비스의 컨트롤러임을 나타냄.여기서 RESTful은 Representational State Transfer의 약자로, 웹 서비스를 구축하는 데 사용되는 아키텍처 스타일 중 하나임. RESTful 서비스에서는 자원(URI)을 표현하는 데에는 명사를 사용하고, 해당 자원에 대한 행위를 표현하는 데에는 HTTP 메서드(POST, GET, PUT, DELETE 등)를 사용함.
@PostMapping("/schedule")
은 Spring Framework에서 사용되는 애노테이션으로, HTTP POST 요청이 들어왔을 때 해당 메서드가 실행되도록 지정하는 데 사용
여기서 @PostMapping
은 HTTP POST 요청을 처리하는 메서드임을 나타내며, ("/schedule")
는 해당 요청이 들어왔을 때의 엔드포인트(URI)를 지정함. 즉, 클라이언트가 /schedule
엔드포인트에 POST 요청을 보내면 이 메서드가 실행됨.
- 해당 부분을 말함.
-@RequestBody
는 Spring Framework에서 사용되는 애너테이션으로, HTTP 요청의 본문(body)에 있는 데이터를 해당 메서드의 매개변수로 변환하는 데 사용됨.
여기서
@RequestBody ScheduleRequestDto requestDto
는 HTTP POST 요청의 본문에 있는 데이터를ScheduleRequestDto
객체로 변환하여 해당 메서드의 매개변수requestDto
로 전달한다는 것을 의미함.다시 말해, 클라이언트가 HTTP POST 요청을 보낼 때 요청 바디에 일정 등록과 관련된 데이터를 담아서 보내면 이 데이터는 Spring에 의해 자동으로
ScheduleRequestDto
객체로 변환되어createSchedule
메서드의 매개변수로 전달됩니다. 이를 통해 컨트롤러는 클라이언트로부터 받은 데이터를 쉽게 처리할 수 있게 됨.@PathVariable Long scheduleId
: 애너테이션은 URL 경로에서 경로 변수를 추출하는 데 사용됨. 여기서scheduleId
는 URL의 일부로 전달되는 경로 변수임. 예를 들어 “/schedule/123”와 같은 요청이 있을 때, “123”은scheduleId
에 매핑됨. 그리고 이 값은 메서드의 매개변수로 전달되어 사용됩니다.@RequestBody ScheduleRequestDto requestDto
: 이 애너테이션은 HTTP 요청의 본문(body)에 있는 데이터를 해당 메서드의 매개변수로 매핑하는 데 사용됨. 여기서requestDto
는 JSON 또는 XML과 같은 형식으로 전달된 요청 본문을 자동으로 역직렬화하여ScheduleRequestDto
객체로 변환함.
@RequestParam String password
: 이 어노테이션은 HTTP 요청의 쿼리 문자열(query string) 또는 폼(form) 데이터에서 매개변수를 추출하는 데 사용. 여기서 password
는 URL의 쿼리 문자열 또는 폼 데이터에서 추출되어 메서드의 매개변수로 전달됩니다. 요청의 URL이 “/schedule/123?password=abc”와 같은 경우, “abc”는 password
매개변수에 매핑됨.
1
2
3
4
5
List<ScheduleResponseDto> scheduleResponseDtoList = new ArrayList<>(scheduleList.values().stream().map(schedule -> {
ScheduleResponseDto responseDto = new ScheduleResponseDto(schedule);
responseDto.setPassword("-");
return responseDto;
}).toList());
scheduleList
맵에 있는 각각의 일정을ScheduleResponseDto
객체로 변환하고, 이를 리스트에 추가하는 과정scheduleList.values()
:scheduleList
맵의 값들만을 가져옴. 이 값들은 모든 일정을 나타냄..stream()
: 값들로부터 스트림을 생성합니다. 스트림을 사용하면 일정을 한 번에 하나씩 처리할 수 있습니다..map(schedule -> { ... })
: 각각의 일정에 대해 변환 작업을 수행. 여기서schedule
은 현재 처리 중인 일정을 나타냄.{ ... }
: 람다 표현식을 사용하여 각각의 일정을 변환합니다. 람다 표현식은Schedule
객체를 받아ScheduleResponseDto
객체로 변환하는 작업을 수행ScheduleResponseDto responseDto = new ScheduleResponseDto(schedule);
: 현재 처리 중인schedule
객체를 기반으로 새로운ScheduleResponseDto
객체를 생성responseDto.setPassword("-");
: 생성된ScheduleResponseDto
객체의 비밀번호를 “-“로 설정return responseDto;
: 생성된ScheduleResponseDto
객체를 반환함.
1
Collections.sort(scheduleResponseDtoList, (o1, o2) -> o2.getDate().compareTo(o1.getDate()));
(o1, o2) -> o2.getDate().compareTo(o1.getDate())
: 비교자(comparator)임.이 비교자는 두 개의
ScheduleResponseDto
객체(o1
과o2
)를 받아서 비교함. 비교자는 두 객체를 비교하여 어떤 객체가 더 작은지를 결정하는 로직을 제공하고 여기서는getDate()
메서드를 통해 두 일정의 작성일자를 가져와서 비교하고,compareTo()
메서드를 사용하여 일정을 내림차순으로 정렬함.compareTo()
메서드는 두 일정의 작성일자를 비교하여 정렬 순서를 결정하며, 결과가 음수면o1
이o2
보다 작은 것으로 간주되어o1
이o2
앞에 오게 됩니다.@ControllerAdvice
는 Spring 애플리케이션에서 전역적으로 예외 처리를 관리하기 위해 사용JDBC 는 우리가 만든 자바 Application과 DB를 연결해주는 역할
DI 패턴 : 외부에서 객체를 주입하는 패턴, 제어의 역전 설계 원칙
📌 JdbcTemplate을 사용할 수 있었던 이유 :
- Spring 프레임워크가 JdbcTemplate을 bean으로 관리하고 있음. JdbcTemplate이 bean으로 등록이 되어있었기 때문에 Schedule Repository에서 받아와서 사용할 수 있었음. 즉, 생성자 파라미터에 삽입한 게 Spring에 넣어준 것. Spring이 IoC 컨테이너에서 JdbcTemplate bean을 찾아가지고 넣어준 것.
그렇다면 bean으로만 등록하면 사용이 가능한가?
autowired 애너테이션을 삽입해야 함. 하지만 Spring이 4.3 버전 이후 생성자 선언이 한 개일 때만 autowired 애너테이션 생략이 가능해짐.
📌 JPA 사용 이유 :
ORM프레임워크로, 데이터베이스와 객체지향개발을 연결해주고 두 분야의 개발이 독립적으로 이루어질 수 있도록 한다.
JPA는 애플리케이션과 JDBC 사이에서 동작한다. java 애플리케이션과 jdbc API 사이에 JPA 있는데, 개발자가 직접 Jdbc api를 쓰는 것이 아니라Jpa에게 명령하고 그 Jpa가 jdbc api를 사용하여 sql 실행하는 것
추가 🕤
🐱🏍— —🤸🏻♀️ ~~~ 야~호~