728x90

Backend 150

Feign 파일 전송하기

RestApi를 통해 파일을 전송해야 할 일이 있었다. RestClient 로는 Feign을 사용하고 있었기 때문에 그걸 사용하고자 했고 해당 내용으로 구글링을 해보니 많은 자료가 나왔다. 개인의 포스팅이 아니라 약간 공식적인 단체? 같은 곳에 기록되어 있는 것을 예로 들면 아래와 같은 것들이다. https://www.baeldung.com/java-feign-file-upload https://recordsoflife.tistory.com/206 너무 간단하다. 처음에 이걸 보고 구현을 쉽게 생각했는데 결국 성공하지 못하고 일주일을 허비했다. 물론 중간중간 운영업무가 있어서 물밀듯이 들어온 것도 한 몫 했지만 일주일 간 구글링에서 나오는 모든 자료를 뒤져보았지만 모두 다 위와 같은 방식이었다. 위에서 ..

Backend/Spring+Boot 2021.08.09

Ajax와 @RequestBody, @ResponseBody

너무 단순한 주제지만 프로젝트를 분석하다보면 잘못 사용된 경우도 있고 나도 제대로 알지 못하고 사용했던 부분이 있어 정리해놓는다. 우선 아래와 같은 Controller 메소드가 있다고 가정해보자. 해당 메소드에서는 @RequestBody 에 의해 request body 에 있는 json 문자열을 Map 타입 payload로 역직렬화 해서 읽어오고 @ResponseBody 에 의해 Map 타입 map 을 json 문자열로 직렬화해서 리턴한다. @PostMapping("/update") @ResponseBody public Map update(@RequestBody Map payload) { Map map = new HashMap(); map.put("test", "test"); return map; } 위..

Backend/Spring+Boot 2021.08.04

@RequestParam, @ModelAttribute 생략

Spring 기반 프로젝트에서 Controller 내부 메소드의 인자에 지정하는 어노테이션이다. 일반적으로 primitive type은 @ReuqestParam 로 지정하고 reference type 은 @ModelAttribute 로 지정한다. 그런데 만약 이를 생략하면 어떻게 되나? primitive type는 자동으로 @ReuqestParam을 지정한 것처럼 동작하고 reference type은 자동으로 @ModelAttribute를 지정한 것처럼 동작한다. 그런데 또 한가지 중요한 사실이 있으니 @ReuqestParam 의 required 는 default 가 true로 요청시 해당 파라미터가 존재하지 않으면 기본적으로 에러가 발생한다. 파라미터로 primitive type 를 사용하고 @Reuq..

Backend/Spring+Boot 2021.08.04

Thymeleaf 훑어보기

기본적인 개발 방식 일반적으로 화면을 구성할 때 top, footer 영역은 거의 변하지 않고 content 영역만 달라진다. 이에 Thymeleaf 는 기본적으로 top, content, footer 의 배치가 정의된 레이아웃을 html 로 미리 만들어 놓고 이를 이용해서 실제 페이지를 만드는 방식을 사용한다. 레이아웃도 여러개를 만들어서 사용할 수 있고 여기에 사용되는 top, footer 는 거의 변하지 않으므로 일반적으로 특정 html 로 생성해놓고 재활용하는데 이를 컴포넌트라고 명명한다. 이는 jsp 의 include 방식과 비슷하다. 결국 레이아웃에는 top, content, footer 가 정의되어 있지만 content 의 실제 구현부는 비어있는 상태로 정의되고 실제 페이지 개발시 conte..

Backend/Spring+Boot 2021.07.30

의존성 주입시 중복되는 타입에 대한 처리

특정 클래스의 의존성을 주입하려고 할 때 동일한 타입이 여러개 존재하는 경우가 있을 수 있다. 하나의 Interface 를 다수의 클래스에서 implements 해서 다형성을 구현한 경우가 바로 그것인데 @Autowired 를 통한 의존성 주입이나 생성자를 통한 의존성 주입 모두 타입을 기준으로 하기 때문에 이 경우 적절한 Bean을 결정하지 못해 의존성 주입이 실패한다. 이 때는 일반적으로 @Qualifier 어노테이션을 통해 Bean id 를 명시해주면 해당 의존성이 정상적으로 주입된다. 하지만 이것 말고도 의존성을 주입하려는 클래스 변수의 명칭을 Bean id로 만들면 @Qualifier 어노테이션을 명시한 것과 동일한 효과를 볼 수 있다. 뭔가 더 간단하고 쉬운 방법인 것 같지만 서칭을 해보니 이..

Backend/Spring+Boot 2021.07.23

Spring에서 권장되는 의존성 주입 방법

A클래스에서 B클래스의 메소드를 사용하려면 A클래스에서 B클래스를 인스턴스화 해서 사용해야 한다. 이 때 B를 A의 의존성이라고 하고 B의 인스턴스를 생성하는 것을 의존성을 주입한다고 표현한다. 이러한 연결을 위해 일반적으로 A클래스에서 코드상 new B() 를 통해 B의 의존성을 직접 주입해야 하지만 Spring 환경이라면 이러한 의존성성 주입을 Spring에서 담당해준다. 하지만 컨테이너에게 의존성을 주입해 달라는 액션을 취해야 하는데 그 방법은 아래와 같이 세 가지가 있다. 생성자 정의 Setter 메소드 정의 필드에 @Autowired 지정 이 중 권장되는 방식은 생성자 정의 방식이다. 여러 이유가 있겠지만 개인적으로 많이 공감했던 내용 위주로 정리해본다. Setter 메소드 정의 방식의 경우 기..

Backend/Spring+Boot 2021.07.23

Mockup 서버는 무엇을 사용해야 하나?

RestClient 를 테스트 한다고 할 때 테스트코드 수행시마다 실제 서버를 호출한다면 내가 원하는 예외상황에 대해 다양하게 테스트하기가 힘들다. 이런 이유를 일반적으로 mockup 서버를 구동시켜서 그것을 호출하게 한다. 많이 사용되는 mockup 서버 라이브러리는 WireMock 과 MockWebServer 가 있는데 무엇을 선택해야 할까? https://pythonq.com/so/java/760899 java - WireMock 대신 MockWebServer를 사용하는 이유는 무엇입니까? - IT 툴 넷 java - WireMock 대신 MockWebServer를 사용하는 이유는 무엇입니까? 기사 출처 java mocking wiremock mockwebserver pythonq.com 요약하면 ..

Backend/TDD, Junit 2021.07.22

테스트 구성파일 관리

SpringBoot 환경에서 테스트코드를 작성할 때 구성정보를 파일로 관리하고 싶은 경우가 있다. Spring 환경에서 application.yml 파일이 구성정보를 파일로 관리하는 대표적인 예인데 이 방식을 테스트 코드에서도 활용하고 싶은 경우를 말한다. 만약 테스트 클래스에 @SpringBoot 를 명시했다면 테스트 코드 수행시 스프링 컨테이너가 로드되고 src/main/resources 하위에 있는 구성 파일들을 참조할 수 있다. 알다시피 src/main/resources 하위에는 구성정보를 관리할 application.yml 파일과 application-*.yml 파일을 함께 둘 수 있고 application.yml 파일이 가장먼저 읽혀지고 어플리케이션 실행 시 지정하는 spring.profile..

Backend/TDD, Junit 2021.07.21
728x90