컴공생의 발자취

[내일배움캠프 24일차 TIL] ResponseEntity 및 ExceptionHandler 본문

🤝 활동/내배캠TIL

[내일배움캠프 24일차 TIL] ResponseEntity 및 ExceptionHandler

MNY 2024. 5. 21. 11:25
728x90
반응형
오늘의 진도 : 개인과제 두 번째 재제출까지...

총 9단계까지 중에서 7단계까지 함!
오늘의 학습, 오늘의/지난 날의 궁금증, 코드카타, 면담, 오늘의 회고 이렇게 6개의 큰 틀로 나누어 정리할 것이다.

 

💡 오늘의 학습 키워드

- 개인과제 -
ResponseEntity
ExceptionHandler
Swagger
Validation


 

ResponseEntity

: HTTP 요청(Request) 또는 응답(Response)에 해당하는HttpHeaderHttpBody를 포함하는 클래스

 

  • 내가 작성한 코드(더보기 ..Click)
더보기

* CommonResponse.java

package com.nbcamp.agendaappserver;

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Builder
public class CommonResponse<T> {
    private Integer statusCode;
    private String msg;
    private T data;
}

 

* entity/Agenda

package com.nbcamp.agendaappserver.entity;

import com.nbcamp.agendaappserver.dto.AgendaRequestDto;
import jakarta.persistence.*;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.Size;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDate;

@Entity // JPA가 관리할 수 있는 Entity 클래스 지정
@Getter
@EntityListeners(AuditingEntityListener.class) // 자동으로 시간을 넣어주는 기능을 하게 해 줌
@Table(name = "agenda") // 매핑할 테이블의 이름을 지정
@NoArgsConstructor
public class Agenda{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Setter
    @Column(name = "title", nullable = false)
    @Size(max = 200, message = "제목은 200자 이내로 작성해주세요.")
    private String title;
    @Setter
    @Column(name = "content")
    private String content;
    @Setter
    @Column(name = "manager")
    @Email(message = "이메일 형식으로 입력해주세요.")
    private String manager;
    @Column(name = "psword", nullable = false)
    private String psword;

    @CreatedDate
    @Column(updatable = false)
    @Temporal(TemporalType.DATE)
    private LocalDate createdAt;

    @Builder
    public Agenda(String title, String content, String manager, String psword) {
        this.title = title;
        this.content = content;
        this.manager = manager;
        this.psword = psword;
    }

    public void update(AgendaRequestDto requestDto) {
        this.title = requestDto.getTitle();
        this.content = requestDto.getContent();
        this.manager = requestDto.getManager();
    }

}

 

 * dto/AgendaRequestDto.java

package com.nbcamp.agendaappserver.dto;

import com.nbcamp.agendaappserver.entity.Agenda;
import lombok.Getter;

@Getter
public class AgendaRequestDto {
    private String title;
    private String content;
    private String manager;
    private String psword;

    public Agenda toEntity() {
        return Agenda.builder()
                .title(title)
                .content(content)
                .manager(manager)
                .psword(psword)
                .build();
    }
}

 

*  controller/AgendaController.java

@PostMapping("/agenda")
    @Operation(summary = "일정 작성", description = "일정을 작성할 때 사용하는 API")
    @ApiResponse(responseCode = "200", description = "생성이 완료 되었습니다.", content = @Content(mediaType = "application/json"))
    @Parameters({
            @Parameter(name = "title", description = "일정 제목", example = "일정 제목"),
            @Parameter(name = "content", description = "일정 내용", example = "일정 내용"),
            @Parameter(name = "manager", description = "담당자", example = "qwer1234@naver.com"),
            @Parameter(name = "psword", description = "비밀번호", example = "qwer1234!")
    })
    public ResponseEntity<CommonResponse<AgendaResponseDto>> createAgenda(@Valid @RequestBody AgendaRequestDto requestDto) {
        Agenda agenda = agendaService.createAgenda(requestDto);
        AgendaResponseDto response = new AgendaResponseDto(agenda);
        return ResponseEntity.ok()
                .body(CommonResponse.<AgendaResponseDto>builder()
                        .statusCode(HttpStatus.OK.value())
                        .msg("생성이 완료 되었습니다.")
                        .data(response)
                        .build());
    }

 

 * repository/AgendaReposiroty.java

 

* service/AgendaService.java

 

 

* 참고한 블로그

 

ResponseEntity의 사용법 및 유지보수

ResponseEntity를 쓰는 이유 일반적으로 Controller에서 아래와 같이 객체를 Return 하는 경우 HTTP 응답을 제어할 수가 없습니다. @GetMapping("/") public User getUser() { User user = userService.getUser(); return user; } 하지

stir.tistory.com

 

ExceptionHandler

* 참고한 블로그

 

예외 처리(Exception Handling)

1. 들어가기

ss-hoon.github.io

 

 

Spring 예외 처리를 실무에 맞게 커스텀해보자

HandlerExceptionResolver를 실무에서 활용해보았습니다.

velog.io

 

Swagger

* 참고한 블로그

 

SpringBoot 프로젝트에 Swagger UI 적용하기

Swagger UI는 프론트엔드와 백엔드의 협업에 사용되는 툴입니다. Swagger UI를 사용하면, API를 시각화하는 코드가 자동으로 생성되기 때문에 보다 간편하게 API를 테스트해 볼 수 있게 됩니다. 또한, AP

velog.io

 

Validation

* 참고한 블로그

 

[Spring] Spring Boot validation을 이용한 파라미터 값 검증

Spring에서 validation 라이브러리는 API 메서드의 파라미터로 들어오는 사용자의 입력값에 대해 검증할 수 있는 수단을 제공하는 라이브러리 이다.대표적으로 @NotNull @NotBlank @NotEmpty 어노테이션을 이

velog.io

 


지난 날의 궁금증

  • Q : PUT vs POST?
    • PUT : resource 전체 갱신 (놓겠다 / 넣겠다)
    • POST : resource 생성(보내겠다)
  • Q : 참조는 reference인데 자바는 call by value로만 동작하는 것 아닌가?
    • 주소값을 복사해서 넘기기에 그게 call by value방식과 같이 동작하기 때문
 

Java 의 Call by Value, Call by Reference

Overview Java 에서 메서드를 호출 시 파라미터를 전달하는 방법에 대해 알아봅니다. 순서는 다음과 같이 진행합니다. Call by Value, Call by Reference 차이 Java 에서의 파라미터 전달 방법 JVM 메모리에 변

bcp0109.tistory.com

 

 

  • 아직 찾아보지 못 한 궁금증(더보기 ..Click!)
더보기
  • Q : wrapper클래스.. 그래서 무슨 기능들을 가지고 있는데?
  • Q : Object.equals와 str.equals의 차이? // 요건 공식 문서를 찾아봐야겠어..
  • Q : JDBC 이란?
  • Q : ORM 이란?
  • Q : 객체의 불변성에 대해 궁금...?

 


코드 카타

* 프로그래머스로 진행

 

  • 알고리즘
    • 최대공약수, 최소공배수
    • 3진법 뒤집기

* 참고한 블로그

 

[Java/알고리즘] 유클리드 호제법(Euclidean Algorithm) : 최대공약수, 최소공배수

해당 글에서는 유클리드 호제법에 대해 이해하고 최대공약수와 최소공배수에서 이를 활용할 수 있는 방법에 대해 공유합니다. 1) 유클리드 호제법(Euclidean Algorithm)💡 유클리드 호제법/알고리즘(

adjh54.tistory.com

 

 

3진법 뒤집기

문제 설명 자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요. 제한사항 n은 1 이상 100,000,000 이

kimk2062.tistory.com

 

  • SQL
    • 인기있는 아이스크림
    • 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

 


면담

지금까지 과제나 강의를 보면서 어려운 점은 없었는지 진도를 어느정도 했는지에 대해 간략하게 대화를 나눴다.내가 어렵다고 했던? 내용은 다음과 같다.

  • ResponseEntity에 대해 과제 해설이 아닌 강의에서 설명해주었다면 좋았을텐데
  • Query String vs Param 에 대한 고민
  • 어떻게 해야 RESTful한 API를 작성하게 될까

대략 요정도의 고민에 대해 말하면서 내가 과제를 시작할 때 너무 시작부터 잘하려다 보니 거부감을 느끼는 것 같다고 하셨다. 역시 튜터님 예리하시다ㅠ 맞는 말이다.. 시작하기 전에 최대한 공부하고 한 번에 잘하려다 보니 과제 시작을 미룰 수 있을 때까지 또는 내가 이해해서 제대로 프로젝트를 만들 수 있겠다는 확신이 어느정도 들어야 시작하는 것 같다..

 


오늘의 회고

  • 12시간 중 얼마나 몰입했는가?

글쎄 과제 재제출이라서 최대한 몰입해서 한 것 같은데..

 

  • 오늘의 생각

공부할게 넘쳐난다아악!!!

너무 많아.. 그래도 없는 것보단 낫지

 

  • 내일 학습할 것은 무엇인지

너무 많아서 지금까지 내가 공부하려고 했던 것도 다 못해서 시간이 조금 촉박해지는 느낌

자료구조 + 알고리즘도 못했고 java 문법 관련이랑 기본적인 개념들을 아직 숙지하지 못해서 그것도 공부해야 하고

내일부터 새로운 강의 들어오니 그것도 봐야돼!

728x90
반응형