spring 8

Spring에서의 예외, 에러 처리

Spring을 사용하다가 @RestControllerAdvice 를 사용하지 않으면 Spring에서 어떻게 예외를 처리하는 지 궁금해졌다. 그래서 이에 대해 알아보고자 한다.Spring의 기본 예외 핸들링1. BasicErrorControllerSpring의 기본 예외 처리는 공식 문서를 통해 알 수 있었다.기본적으로 모든 예외가 발생하면 /error 경로로 Spring이 재요청하여 기본적으로 등록되어 있는 BasicErrorController에서 예외 응답을 반환한다고 한다. 컨트롤러에서 BasicErrorController로의 예외 전달Spring Boot에서 예외가 발생되고, @RestControllerAdvice 및 @ExceptionHandler 에서 예외가 처리되지 않으면 에러가 처음 요청을 ..

Spring 2024.11.02

@ManyToMany를 사용하면 안 되는 이유

@ManyToMany 를 실무에서 사용하면 안된다는 얘기를 많이 들었고, 그래서 항상 관계를 풀어서 사용했었다.이번에 다시 관계를 풀어 사용하면서 왜 풀어야하나 생각해보니 답이 떠오르지 않아 이를 정리해본다.@ManyToMany@Entitypublic class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToMany @JoinTable( name = "student_course" // 중간 테이블의 이름 ) private List courses = new ArrayList(); // 기본 생성..

Spring/Spring Jpa 2024.10.15

Spring에서 @Async를 통한 비동기 처리하기

비동기(Asynchronous)란?작업이 시작된 후 그 결과를 기다리지 않고 다른 작업을 계속 진행할 수 있는 처리 방식을 의미한다.즉, 작업이 실행되는 동안 해당 작업이 완료될 때 까지 기다리지 않고, 다른 작업을 수행한다.예를 들어 이메일 보내기 서비스를 개발한다고 하면,사용자가 서버에 요청했을 때 이메일 보내는 기능은 비동기로 처리하고 이메일 보내는 것과 무관하게 200을 응답한다. 따라서 사용자는 이메일이 보내지는 것을 기다릴 필요 없어진다.작업: 이메일 보내기, 200 응답 보내기시간이 오래 걸리는 작업, 비동기 시킬 직업: 이메일 보내기비동기와 별개로 바로 수행할 작업: 200 응답 보내기왜 사용할까?응답성 향상: 비동기를 사용하면 사용자가 상호작용 하는 동안에도 백그라운드에서 작업을 계속 진..

Spring 2024.09.26

Spring에서의 동기, 비동기

동기 vs 비동기동기 = 요청이 순차적으로 실행되며, cpu가 주어진 요청을 완료하기 전까지는 다음 요청을 처리하지 않는 방식비동기 = 작업이 시작된 후 그 결과를 기다리지 않고 다른 작업을 계속 진행할 수 있는 처리 방식Tomcat 서버에서는 동기, 비동기적 방식 모두 스레드 풀에 여러 스레드가 대기하고 있고, 여러 요청이 한 번에 오면 각 요청에 대해 스레드가 할당되어 처리된다.  동기에서의 작업 처리동기에서 작업 요청이 오면, 각 스레드는 주어진 작업을 모두 스스로 처리한다.위 그림에서 작업2가 외부 API를 호출하고 응답받을 때까지의 지연시간이라고 한다면,작업 2만큼 스레드는 놀게 된다.  비동기에서의 작업 처리작업 2를 비동기 처리해 두었다면, 스레드1, 2는 각각 작업1, 작업3을 마치고 다른..

Spring 2024.09.26

java PageImpl에서 totalElements가 바뀌는 오류 해결

나는 PageImpl을 활용하여 List를 Page로 바꾸어 응답했다.api테스트를 하는 도중 마지막 페이지에 접근하면 totalPage 와 totalElements 가 늘어나는 오류가 발생했다. 문제 상황똑같은 요청에 대해 page정보만 바꿔서 요청을 날려봤다.마지막 페이지인 9페이지 이전인 8페이지를 요청했을 때마지막 페이지인 9페이지를 요청했을 때보이는 거와 같이 totalElements 와 totalPages 가 변경된 것을 볼 수 있다.원인PageImpl이 매개변수로 받는 Pageable 객체는 기본적으로 0번 인덱스부터 시작한다.하지만 모든 ui에서 페이지는 1번 페이지부터 시작하므로 나는 임의로 Pageable의 시작 인덱스를 1번부터 시작하도록 변경하였다.(악몽의 시작이었다.)원인 분석Pa..

Spring 2024.08.13

[개발 일상] Spring 공통 응답 만들기

백엔드 서버에서 클라이언트에게 응답을 보낼 때 응답의 형식을 통일시키는 것은 중요하다.프론트는 백엔드의 응답을 받아, 이를 처리하여 화면에 보여주게 되는데 응답의 형식이 불분명하면 프론트에서 불편함을 겪을 수 밖에 없다.그래서 나는 프로젝트를 시작하기 전에 프론트분들과 소통하여 요구사항을 파악하고 공통 응답을 만들었다.백엔드 요구사항우선 백엔드 입장에서 생각했던 요구사항은 다음과 같았다.상태코드(403등)은 header에서 설정한다.body에는 상태메세지(Not Found등), 본문 data, 시간등을 포함시킨다.프론트엔드 요구사항반면 프론트엔드 입장은 다음과 같았다.상태코드를 헤더로 주면 try catch로 처리해야해서 불편하다.응답에 상태코드와 상태가 둘 다 있으면 좋겠다.결론적으로 시간,성공여부, ..

Spring 2024.08.13

Spring Swagger 적용하기1(기본 swagger-ui 띄우기)

시작하기 앞서…스웨거를 세팅하기 위해서는 springdoc, springfox라는 api 문서화를 도와주는 라이브러리 중 하나를 선택해서 dependency를 추가하게 된다. 이 중 springfox의 경우 2020년 이후로는 업데이트 되고 있지 않으며,그에 비해 springdoc의 경우 현재까지 꾸준히 업데이트 되어 오고 있다. 따라서 이번에는 springdoc을 활욯해 swagger 기능을 구현해보려고 한다.SpringDoc과 Swaggerspringdoc은 api를 json 형태로 응답해준다.이를 이용하여 swagger는 json문서를 ui형태로 읽기 쉽게 만들어주는 역할을 한다.swagger 설정하는 방법1. build.gradle에 swagger 관련 라이브러리를 가져올 수 있도록 설정한다. ..

Swagger 2024.07.17

Spring 자바, 스프링에서 객체 응답시 is로 시작하는 변수가 변경되는 문제

개발을 하다가 다음과 같은응답 객체로 응답을 받았는데내 예상과 달리 응답에 온 변수명이isSuccess → success로 변경되어 온 것을 발견할 수 있었다. 위는 내가 만든 응답 객체이다. 위는 BaseResponse를 상속해서 만든 ErrorResponse이다. 이러한 문제가 발생한 이유는자바빈 규약 때문이다. 자바빈 규약에 따르면boolean의 getter는 is변수명() 과 같이 is로 시작하고Boolean의 경우 getter는 get변수명() 과 같이 get으로 시작한다. 즉 @Getter 를 사용하여 getter를 생성한다면 자바빈 규칙에 따라boolean형 변수는 is변수명() 으로 getter를 생성한다. 여기서 변수명이 is로 시작하는 경우 중복이 되므로 자동으로 변수명을is를 제외한 ..

Spring 2024.05.25