Post

TIL- Spring 입문주차 과제

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 요청을 보내면 이 메서드가 실행됨.

1

  • 해당 부분을 말함.

-@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 객체(o1o2)를 받아서 비교함. 비교자는 두 객체를 비교하여 어떤 객체가 더 작은지를 결정하는 로직을 제공하고 여기서는 getDate() 메서드를 통해 두 일정의 작성일자를 가져와서 비교하고, compareTo() 메서드를 사용하여 일정을 내림차순으로 정렬함.

  • compareTo() 메서드는 두 일정의 작성일자를 비교하여 정렬 순서를 결정하며, 결과가 음수면 o1o2보다 작은 것으로 간주되어 o1o2 앞에 오게 됩니다.

  • @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 실행하는 것

추가 🕤


1

🐱‍🏍— —🤸🏻‍♀️ ~~~ 야~호~

This post is licensed under CC BY 4.0 by the author.