본문 바로가기

Develop/Spring40

Spring MVC - API 문서화 API 문서화란? 클라이언트가 REST API 백엔드 애플리케이션에 요청을 전송하기 위해 알아야 되는 요청 정보를 문서로 잘 정리하는 것을 말한다. 요청 정보에는 요청 URL(또는 URI), Request Body, Query Parameter 등이 있다. 왜 필요할까? 우리가 만든 REST API 기반의 백엔드 애플리케이션을 클라이언트 쪽에서 사용하기 위해서이다. 우리가 만든 제품을 고객이 사용할 수 있도록 메뉴얼을 만들어주는 것이라고 생각하면 된다. API 문서 생성의 자동화가 필요한 이유? 우리가 만든 애플리케이션의 API들을 모두 수기로 작성하는 것은 매우 힘든 일이다. (API의 수가 적다면, 충분히 만들만하다고 생각이 될 수도 있다) 애플리케이션의 기능은 언제든지 추가될 수 있고, 운영 중에 .. 2022. 11. 12.
Spring MVC - Testing(2) Hamcrest JUnit 기반의 단위 테스트에서 사용할 수 있는 Assertion Framework이다. Assertion을 위한 Matcher가 이해하기 쉬운 문장이므로, 가독성이 좋다. 다양한 Matcher를 제공한다. 테스트 실패 메시지를 이해하기 쉽다. JUnit의 Assertion 메서드를 사용한 클래스를 Hamcrest의 Matcher를 이용한 클래스로 변환 Hamcrest의 Matcher를 이용한 코드 줄을 보면, 'assert that actual is equal to expected'라고 이어 읽을 수 있다. '결과 값이 기대 값과 같다는 것을 검증한다'라고 해석할 수 있고, 이것이 가독성이 좋다는 것이다. (Custom Matcher를 직접 구현해서 사용할 수도 있다) Ref) Ham.. 2022. 11. 9.
Spring MVC - Testing(1) 애플리케이션을 구현만 하면 끝일까? 우리는 클라이언트가 아무런 이상 없이 사용할 수 있게끔 잘 만들어야 한다. 즉, 개발자 입장에서는 에러를 최소화하여 애플리케이션을 만들어내야 한다. 에러를 최소화할 수 있는 방법이 바로 'Testing'이다. 단위 테스트란? 단위 테스트를 Unit Test라고 부른다. 우선, 각각의 테스트들에 대해 간략하게 알아보자. 기능 테스트 애플리케이션을 사용하는 클라이언트의 입장에서 애플리케이션의 기능들이 정상적으로 동작하는지를 테스트하는 것 (외부의 서비스와 연동될 수 있기 때문에 단위 테스트라고 보기는 어렵다) 통합 테스트 여러 계층이 얽힌 동작을 테스트하는 것으로, 애플리케이션을 만든 개발자가 테스트의 주체가 된다. (여러 계층이 묶여 있는 테스트여서 독립적인 테스트라고 .. 2022. 11. 8.
JPA(Java Persistence API)와 엔티티 매핑(Entity Mapping) JPA는 Java 진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사양(또는 명세, Specification) JPA라는 인터페이스로 정의되어 있는 구현체는 따로 있고, 우리는 그 구현체를 학습하는 것이다. JPA는 Java Persistence API의 약자이지만, 현재는 Jakarta Persistence라고도 불린다. Hibernate ORM JPA에서 정의해둔 인터페이스를 구현한 구현체로써, JPA에서 지원하는 기능 이외에 Hibernate 자체적으로 사용할 수 있는 API 역시 지원하고 있다. 위 그림과 같이, JPA는 데이터 액세스 계층의 상단에 위치한다. JPA의 Persistence는 영속성, 지속성을 뜻한다. 즉, 무언가를 금방 사라지지 않고 오래 지.. 2022. 11. 1.
Spring MVC - API 계층 Controller 클래스 클라이언트 요청을 처리할 서버 애플리케이션의 기능들을 구현한 클래스 @RestController Spring MVC에서는 특정 클래스에 @RestController를 추가하면 해당 클래스가 REST API의 리소스를 처리하기 위한 API 엔드포인트로 동작함을 정의 @RestController가 추가된 클래스는 애플리케이션 로딩 시, Spring Bean으로 등록 @RequestMapping 클라이언트의 요청과 클라이언트 요청을 처리하는 핸들러 메서드를 매핑해주는 역할 클래스 레벨에 추가하여, 클래스 전체에 사용되는 공통 URL(Base URL)을 설정 가능 produces : 응답 데이터를 어떤 미디어 타입으로 클라이언트에게 전송할지 설정 (Attribute) @GetMappi.. 2022. 10. 30.
GET, POST 메서드 요청 시, DTO 객체에는 setter가 필요한가? PATCH 메서드를 요청받는 DTO 객체에는 getter와 setter 모두 작성한다. 그렇다면, GET, POST 메서드 요청을 받는 DTO 객체도 동일하게 구현하는가? 간단히 요약하면 다음과 같다. - GET 메서드 요청 시, GET 요청의 경우는 JSON 형태의 데이터가 아닌 Query Parameter이다. 그래서, Jackson2HttpMessageConverter를 사용하지 않는다. 이 경우에는 WebDataBinder를 사용한다. 즉, GET 요청의 경우에는 별도의 설정이 따로 없다면, Spring에서는 WebDataBinder의 기본 값 할당 방법인 Java Bean 방식을 사용하기 때문에, setter가 없으면 작동하지 않는다. 그러나, GET 요청의 경우에도 setter를 사용하지 않을.. 2022. 10. 23.
Spring MVC 요청 및 응답 동작 과정 Spring MVC 서블릿 API를 기반으로 클라이언트의 요청을 처리하는 모듈을 spring-webmvc라 하고, 이를 줄여서 Spring MVC라고 부른다. ( 서블릿이란 클라이언트의 요청을 처리하도록 특정 규약에 맞춰 Java 코드로 작성하는 클래스 파일로, 아파치 톰캣이 서블릿들을 웹 애플리케이션으로 실행되도록 해주는 서블릿 컨테이너 중 하나이다 ) * Spring MVC는 클라이언트의 요청을 편리하게 처리해주는 프레임워크이다. Model Spring MVC의 'M' Spring MVC 기반의 웹 애플리케이션이 클라이언트의 요청을 받으면, 요청 사항을 처리하기 위한 작업을 하고, 클라이언트에게 처리한 작업의 결과 데이터를 Model이라 한다. View Spring MVC의 'V' Model 데이터를.. 2022. 10. 21.
Assert.assertTrue(); 안됨 해결 Spring 강의를 듣다가 Assert.assertTrue(); 메서드를 사용해야 하는 경우가 생겼다. 그러나, 계속해서 Assert 부분의 import 가 되지 않았다. 애초에 junit 에 Assert 라는 건 없다고 해서 당황했다. 구글링 결과, import org.junit.jupiter.api.Assertions; Assertions 를 적어주니, 해결이 되었다. 결국, Assert.assertTrue(); 가 아닌 Assertions.assertTrue(); 인 것이다. 구글링에는 모두 Assert 라고 되어있었지만, 짐작으론 19년도 이후로 명명이 바뀐 듯 하다. 해결 끝! 2022. 7. 28.
@Autowired 란? Spring 에서 가장 큰 장점은 DI 이다. DI 란 Dependency Injection 의 약자로 '의존성 주입'이다. 이 DI 를 @Autowired 를 통해서 구현해준다. 보통 객체를 생성한다고 하면, UserRepository userRepository = new UserRepository(); 이러한 방식으로 써준다. 그러나, 이 새로운 객체를 Spring 에서 관리하겠다 라는 차원에서 의존성 주입이 들어간다. 결론은 DI 는 @Autowired 로 구현한다. @Autowired private UserRepository userRepository; 위와 같이 말이다. 2022. 7. 27.