목록백앤드 개발일지 (66)
늘
@RequestBody @RequestBody 애너테이션의 역할은 클라이언트가 보내는 HTTP 요청 본문(JSON 및 XML 등)을 Java 오브젝트로 변환하는 것이다. 기본 생성자만을 가지고 json값을 Java객체로 변환해준다. MappingJackson2HttpMessageConverter 내부의 ObjectMapper를 통해 json값을 Java객체로 역직렬화를 한다. 직렬화가 가능한 클래스들은 기본 생성자가 항상 필수입니다. 즉, ObjectMapper를 통해 역직렬화가 이루어지므로 기본 생성자가 필수라는 말이다! 그렇다면 기본 생성자만을 보고 어떻게 필드를 알고 매핑을 해주는 것일까? Jackson ObjectMapper는 Java 오브젝트의 필드에 맵핑할 때 getter혹은 setter매서드..
테스트 더블 더블이란: 할리우드에서 배우들의 대역을 해주는 사람을 더블이라고 한다. 그래서 말 그대로 테스트할 때 실제 도메인(주연)을 사용하지 않고 Double(대역)을 사용해서 테스트를 한다고 생각하면 된다. 테스트 더블에는 크게 위와 같이 Dummy, Stub, Spy, Mock, Fake로 나눠진다. Dummy 인스턴스화 하여 구현한 가짜 객체 기능 구현이 안돼있다. Stub dummy를 이용하여 실제로 동작하는 것처럼 보이게 만드는 객체 기능 구현이 안돼 있다. 상태 검증을 위한 객체이다. 상태 검증이란 메서드가 수행된 후, 객체의 상태를 보며 올바르게 동작했는지 확인한다는 뜻입니다. 객체를 다양한 조건으로 값을 만들어주고 던져줘도 항상 동일한 값을 반환 Spy 스파이처럼 기록을 하는 역할을 가..
평소에 runtimeOnly는 런타임 때 작동하겠지, implementation은 gradle이 돌아갈 때부터 작동하겠지라고 대충 생각하고 넘겨와서 그런지 막상 퀴즈를 받으니 대답을 못하겠다.. 이번 기회에 공부하고 정리해보려고 한다. 일단 gradle에 의존성부터 확인해 보았다. 일단 눈에 띄었던 것은 빨간 박스로 표시한 것처럼 runtimeClasspath에 implementation으로 선언된 의존성 파일들이 들어있었다. 대충 implementation은 시작부터 runtime때까지 의존성이 살아있는구나(?)라고 생각했다. CompileClasspath 에러 없이 컴파일을 하기 위해 필요한 클래스와 jar들의 위치를 나타낸다. compileClasspath만 잘 설정했다고 애플리케이션이 잘 작동하는..
자바를 사용하다보면 List를 만드는데 여러가지 방법들을 사용해왔었다. 그 차이를 모르고 손에 익히는대로 사용했는데 이번에 정리를 하려고 한다. import java.util.ArrayList; // new ArrayList() import java.util.Arrays; // Arrays.asList() import java.util.List;// List.of() 차이점 1. 원소를 추가/삭제할 수 있나? 원소를 추가/삭제 set 사용 가능 new ArrayList() 가능 가능 Arrays.asList() 불가능 가능 List.of() 불가능 불가능 ArrayList()에 List값을 하나만 넣으려면 List.of()를 감싸서 넣으면 된다. 그렇지 않고 List.of()로 한 후 add를 하면 아래..
오랜만에 글을 작성하네요.. ㅎ🤣🤣 우테코 전에는 스프링으로 프로젝트를 하면서 필요한 자바 문법들을 찾아서 공부했다면, 우테코를 시작하면서는 자바 본연에 대해 공부를 하고 있는데요. 오늘은 java8 람다식과 스트림에 대해 알아보려고 합니다. 사실 자동차 경주 미션을 진행하면서 오랜만에 람다를 사용하면서 매번 찾아보면서 사용했던 람다를 한번 공부해보자는 생각으로 작성합니다. 람다식(Lambda Expression)🤡 문법 문법은 간단합니다. 코드를 보는게 이해가 더 빠를 것이라고 생각됩니다. public int sum(int a, int b) { return a + b; } //람다식 변환 (a, b) -> a + b; 장점 매우 깔끔하고 알아보기도 쉽다. 동작을 사용하기 위해서 클래스를 정의할 필요도 ..
동시성 내용이 어려워서 개인적으로 따로 한 번 정리를 해보았다. 13장 동시성📌 동시성과 깔끔한 코드는 양립하기 어렵다. 👀 여러 스레드를 동시에 돌리는 이유 & 어려움 이런 어려움에 대처하여 깨끗한 코드를 작성하는 방법 동시성을 테스트하는 방법과 문제점 동시성이 필요한 이유? 동시성은 결합을 없애는 전략이다. 무엇(what) 과 언제(when)를 분리하는 전략이다. 서블릿은 웹 혹은 EJB라는 컨테이너 아래서 돌아간다. 이들 컨테이너는 동시성을 부분적으로 관리한다. 웹 요청이 들어올 때마다 -> 웹 서버는 비동기식으로 서블릿을 실행한다. 프로그래머는 모든 웹 요청을 관리할 필요가 없다. 원칙적으로 각 서블릿 스레드는 다른 서블릿 스레드와 무관하게 자신만의 세상에서 돌아가기 때문이다. 동시성에 대한 오해..
계층형 아키텍처(Layered Architecture) or 멀티 티어(tier) 아키텍처 - 책임과 성격이 다른 것을 크게 그룹으로 만들어 분리해두는 것 - 유사한 관심사들을 layer로 나눠서 수직적으로 배열한 것 보통 웹 기반의 엔터프라이즈 애플리케이션은 3개의 계층을 갖는다고 해서 3계층 애플리케이션이라고도 한다. 3계층 아키텍처와 수직 계층(토비의 스프링) Presentation Layer: 웹 기반의 UI를 만들어내고 그 흐름을 관리하는 계층 Service Layer: 비즈니스 로직을 담고 있는 계층 DataAccess Layer: 백엔드의 DB나 레거시 시스템과 연동하는 인터페이스 역할을 하는 계층(infrastructure 계층) 3계층 아키텍처(조영호 개발자님) Presentation: ..
왜 스프링은 싱글톤으로 Bean을 만드는가? 스프링은 was 시작과 동시에 Ioc컨테이너에 빈을 생성하고 관리한다. 따라서 서버의 성능을 좋게 하기 위해서 싱글톤 방식을 취한다. 싱글톤 방식을 사용하지 않는다면 매번 Bean을 생성해야 하므로 성능이 안 좋다. 하지만 싱글톤을 사용하면 한 번에 Bean을 여러 개 만들어서 요청이 들어올 때마다 사용하면 되기 때문에 성능이 좋아진다. 저번 게시물에 디자인 패턴에서 싱글톤 패턴을 학습해서 정리했었다. 그런데 이번 스프링 컨테이너의 싱글톤을 공부하면서 같은 싱글톤이라고 생각했는데 스프링의 싱글톤 레지스트리와 자바의 싱글톤 패턴은 다르다고 한다! 싱글톤 레지스트리는 자바의 싱글톤 패턴의 단점을 보완한 것이라고 한다. 자바의 싱글톤패턴의 단점은 아래와 같다. pr..
대표적으로 외부 api를 호출하는 방식에 resttemplate이 있는데 이것은 동기 방식을 이용한 방법이고, WebClient가 비동기를 이용한 방식이다. 공식문서를 보면 스프링 5부터는 webClient사용을 더 추천하고 있다. 또한 restTemplate은 곧 deprecated 된다고 한다. 공통점으로는 둘 다 Http client에서 사용된다는 것이다. RestTemplate RestTemplate은 Multi-Thread와 Blocking방식을 사용합니다. Thread pool은 요청자 어플리케이션 구동 시에 미리 만들어 놓습니다. Request는 먼저 Queue에 쌓이고 가용한 스레드가 있으면 그 스레드에 할당되어 처리됩니다. 즉, 1 요청 당 1 스레드가 할당됩니다. 각 스레드에서는 Blo..
MVC 패턴 Model + View + Controller 가장 흔하고 알려져 있는 패턴이다. Model : 데이터와 데이터를 처리하는 부분 View : UI Controller : 사용자의 입력(Action)을 받고 처리하는 부분 MVC 패턴의 동작 순서 모든 Input은 Controller로 전달됩니다. Controller는 Input을 확인하고 Model을 업데이트합니다. 업데이트 결과에 따라 View를 선택합니다.(하나의 Controller는 View를 선택할 수 있기 때문에 1:n 관계로, 여러 개의 View를 관리할 수 있습니다.) Controller는 Model을 나타내 줄 View를 선택만 할 뿐, 직접 업데이트하지는 않습니다.(View는 Controller를 알지 못합니다.) View는 ..