문자열 응답 시 공통응답형식이 적용되지 않는 문제 개선하기
MessageConverter가 결정되어 문자열을 DTO객체로 바꾸지 못하는 문제! 어떻게 해결할 수 있을까
MessageConverter가 결정되어 문자열을 DTO객체로 바꾸지 못하는 문제! 어떻게 해결할 수 있을까
공통 응답 형식을 적용하고 싶은데 어떤 기능을 사용해야할까?
Jpa Entity에서 DB에 사용중인 Legacy Enum들을 깔끔하고 효율적으로 관리해보자
RequestParam, ModelAttribute 내 Legacy Enum들을 깔끔하고 효율적으로 관리해보자
요청, 응답 Body 내 Legacy Enum들을 깔끔하고 효율적으로 관리해보자
JPA에서 사용되는 구성요소들과 이 구성요소들을 스프링 컨테이너는 어떻게 제공하는걸까?
JDBC와 DataSource은 왜 필요할까? 커넥션과 커넥션을 회수하는 방법
컴포넌트 스캔과 자동구성 빈들이 실제로 등록되고 객체로 만들어지는 과정을 쫒아가보자
SpringApplication 의 run 메서드는 어떤 과정을 거쳐 어플리케이션을 실행하는지 알아보자
Spring Container의 전신인 ApplcationContext는 어떤 역할과 책임을 가지는지 살펴보자
main함수 실행 후 SpringApplication이 생성되는 과정을 소스코드와 함께 살펴보자
Lock(잠금)은 데이터 처리를 위해 동시성을 제어하기 위한 메커니즘으로 여러방면에서 이를 활용한다. 이 포스트에서는 어플리케이션이 취할 수 있는 Lock의 종류와 Lock으로 인해 생기는 문제점과 해결방법에 대해 작성한다.
데이터시스템에는 여러가지 문제가 생길 수 있다. 데이터베이스로의 쓰기 연산 실패, 데이터 조작 중 어플리케이션 다운, 애플리케이션과 데이터베이스 간 네트워크 통신 장애, 데이터베이스로의 동시 쓰기 등 여러가지 결함이 발생할 수 있다. 이러한 결함이 발생할 때면 데이터베이스 내 데이...
단일 리더 가반의 시스템에서는 리더가 하나만 존재하고 모든 쓰기가 해당 리더를 거쳐야 한다. 하지만 네트워크 지연 등의 이유로 리더에 접근이 불가능 해지거나 쓰기 트래픽 부하가 증가하게 된다면 쓰기 작업을 하지 못하는 상황이 발생할 수 있다. 때문에 쓰기 작업이 많은 서비스의 경우...
복제(Replication)란 네트워크로 연결된 여러 장비에 동일한 데이터의 복사본을 유지한다. 복제가 필요하거나 사용하는 이유는 다음과 같다. 지연시간 down - 지리적으로 사용자와 가깝게 유지 가용성 up - 시스템 일부에 장애가 발생해도 지속적으로 동작 읽기 처...
우리가 작성한 자바 프로그램이 동작하기 위해서는 javac 명령어를 통해 .java 파일을 .class 바이트코드로 컴파일한 뒤 java 명령어를 통해 이 .class 코드를 JVM이 읽어 실행해야한다. JVM은 여러 구성요소들로 이루어져 있으며 이 요소들이 유기적을 연결되어 프로...
Message Queue에 대해 알아보기 전에 컴퓨팅 시스템에서 Queue가 어떤 의미를 가지는지 훑고 넘어가자. 컴퓨팅 시스템에서 서로 다른 시스템 간 커뮤니케이션을 할때, 그 중간에 Queue를 두는 것이 일반적이다.
근래 MSA, 쿠버네티스, 카프카 등 대규모 서비스에서 사용되는 여러가지 기술들에 대해 눈으로 보고 귀를 듣는 경우가 많아졌다. 꽤나 예전부터 학습하고자 하는 마음에 관련 포스트들을 북마크에 쟁여 놓고 있었는데 일련의 경험이 트리거가 되어 드디어 그 보따리를 풀게 되었다. 먼저, ...
Nginx는 이벤트 기반의 비동기-논블로킹 방식을 사용한다. 덕분에 다량의 트래픽을 빠르게 처리하는 것이 가능하다. 하지만 Nginx의 이런 동작구조에서도 ‘블로킹’ 문제가 발생하는 이벤트들이 존재하였고 이 문제를 보완하기 위해 쓰레드 풀 매커니즘을 추가하게 되었다.
현재(2023년 9월 기준) 가장 인기있는 웹서버가 무엇이냐고 물어보면 단언컨대 Nginx가 빠질 수 없다. Nginx는 2004년 출시 이후 꾸준히 웹서버 시장에서 점유율을 높이기 시작했다. 2008년 모바일 시장이 본격화됨에 따라 급부상하여 현재에 이르러 시장 점유율 34% 기...
CQRS(Command and Query Responsibility Segreagation)는 데이터 변경과 데이터 조회를 서로 다른 모델로 처리하는 것을 의미한다. 기존의 데이터베이스 접근 방식에서 변경과 조회에 대해 같은 모델을 사용하는 것과 달리 CQRS는 변경과 조회를 분리...
테스트의 목적은 설계를 검증하기 위함이다. 어떠한 목적을 이루기 위한 비즈니스 로직을 설계하고 해당 설계가 제대로된 결과값을 내는지를 검증하기 위해 이용한다. 테스트를 작성함으로써 검증 및 예상되는 문제를 미리 확인할 수 있다는 장점이 있다.
Spring boot에서 Filter를 만들기 위한 방법에는 여러가지가 존재한다. 그 중 자주 사용하는 방식은 다음과 같다. Filter 인터페이스 이용 GenericFilterBean 추상 클래스 이용 OncePerRequestFilter 추상 클래스...
Spring boot를 이용한 프로젝트 도중 WebMvc 설정에 문제가 발생하였다. WebMvcConfigurationSupport와 WebMvcConfigurer를 혼용하면서 발생한 문제였다. 가까스로 문제를 해결한 후 해당 개념에 대한 지식이 부족하다고 판단하여 이에 관한 내용...
Controller의 메서드에 파라미터로 사용하는 @RequestParam, @RequestBody 는 어떻게 동작하는 것일까? Controller의 파라미터로 클라이언트의 요청정보가 아닌 추가적인 정보를 넘길 수 있을까? 이러한 의문들을 해결하기 위해 HandlerMethodAr...
Spring Security은 인증 기능을 지원해준다. 인증방식에는 Username/Password를 이용한 방식, OAuth2.0을 이용한 방식 등 여러가지 메커니즘들이 존재하는데 Spring Security는 여러가지 인증방식에 대해 모두 지원해준다.
Spring Security는 Spring Framwork를 기반으로 한 인증과 인가, 웹 공격에 대한 방어를 위한 기술이다. Servlet Container, Webflux 기반 모두 지원한다. 이 중 Servlet Container 기반으로 Spring Security가 동작하...
MySQL에는 날짜 표기법으로 DATE, DATETIME, TIMESTAMP가 있다.
Java는 오랜역사를 가진만큼 현재까지 여러버전이 출시되었다. 각 버전마다 큰 변화를 가지고 오기도 했는데 그 중 8, 11, 17 버전에서의 변화를 살펴보자.
Spring boot의 자동화
Spring을 이용하여 서버를 구현할 때 보통 Tomcat을 Servlet Container로 많이 이용한다. 그렇다면 Tomcat은 어떻게 클라이언트의 요청을 받아들이고 Spring 웹 어플리케이션으로 요청을 전달하게 되는걸까?
Spring이 HTTP 요청을 받아들이고 처리하는 핵심 요소인 Servlet Container란 무엇인지 알아보자.
Spring을 이용하여 만들어진 웹 어플리케이션은 어떤 과정을 거쳐 실행되고 요청을 받아들이는 걸까? Spring 웹 어플리케이션의 실행과정에 대해서 자세하게 알아보자.
빌드 관리 도구는 라이브러리 의존성 관리 및 주입하고 프로젝트 내 작성한 xml이나 java 파일들을 패키징하는 과정을 담당한다. 어플리케이션 빌드 과정에 필요한 전반적인 부분을 모두 처리해주어 빌드 자동화 도구라고도 불린다. 이러한 빌드 관리 도구를 통해 JVM이나 WAS가 인...
익히 알고 있듯 데이터베이스는 데이터를 생성하거나 조회를 하기 위해선 insert, select 와 같은 SQL 문법을 사용해야한다. 데이터베이스에 대해 공부해본 사람들이라면 익숙하게 사용할 수 있을 것이다. 하지만 이를 프로그래밍 언어를 기반으로 하는 서버 개발에서 사용하게 된다...
컴퓨터 내부 장치들은 연산장치와 기억장치로 나누어진다.(+ 주변장치) 연산장치에는 CPU와 GPU가 존재하며, 기억장치로는 RAM, SSD, HDD 등이 있다. 연산장치는 일꾼으로 주어진 명령을 처리하는 역할을 할 뿐이며, 그 자체로 최대 처리 속도가 정해져있다.
동일한 요청에서 이전 요청과 결과값이 같다면 굳이 재요청을 해야할까? 네트워크 지연시간과 더불어 서버에도 트래픽이 발생하게 될것이다. 이러한 문제를 위해 캐시를 이용한다. 캐시라 함은 익히 알다시피 이전 요청을 저장하여 빠른 시간 내 응답받는 방법이다. 캐시는 하드웨어, 하나의 호...
스프링 프레임워크는 IoC 원칙을 구현한 IoC Container(이하 스프링 컨테이너)를 내장하고 있다. 이것은 스프링 프레임워크의 가장 중요한 개념이다. 복잡한 객체간의 관계를 관리하고 의존 객체를 생성하고 주입해주는 역할을 한다. 덕분에 객체 생성과 관리에 대한 제어권을 외부...
기본 자료형들은 객체가 아니기 때문에 객체를 다룰때 제공되는 유용한 메서드들을 사용하지 못한다. 이를 보완하기 위해, 자바에서는 기본 자료형을 객체로 다룰 수 있도록 래퍼 클래스를 제공한다. int -> Integer char -> Character bool...
Java에서는 문자열을 표현하기 위해 여러가지 클래스들을 제공하며, 문자열을 조작하기 위해 많은 메서드들을 지원해준다. 자세히 살펴보자.
💡 Notice 반응형 프로그래밍을 이해하기 위해 아등바등댄 필자의 생각 정리가 담긴 글입니다. 따라서, 여타 잘 정리된 블로그들과 관점이 다를 수 있습니다.
Spring(이하 스프링)은 Java로 웹 어플리케이션을 편하게 개발할 수 있도록 도와주는 오픈소스 프레임워크다. 스프링은 이전 기술들과 비교해 웹 개발을 보다 간편하게 할 수 있어 개발 생산성을 높여준다. 이전 개발자가 작성해야했던 불필요하고 복잡한 코드들을 제거하여 비즈니스 로...
왜 스프링인가? Spring - 핵심가치(POJO) Spring - 핵심가치1(IoC/DI) Spring - 핵심가치2(AOP) Spring - 핵심가치3(PSA) Spring - 핵심가치++(Bean) ...
클라이언트의 요청을 처리하는 뒷단 서버에는 수많은 기술들이 존재한다. 그 중에서 요청 데이터를 처리하기 위한 가장 기본이 되는 웹 서버, 웹 어플리케이션 서버, 웹 프레임워크에 대해 알아보자.
HashTable(이하 해시테이블)은 데이터를 저장하고 빠른 검색을 하기위한 자료구조이다. 해시테이블에 데이터를 저장할때 키 값을 간단한 계산을 거쳐 인덱스로 만들고 해당 인덱스에 데이터를 저장한다.
프로세스 간의 협력, 분산 처리를 위해 멀티 프로세싱을 이용한다. 하지만 각각의 프로세스가 자신만의 메모리 공간을 가지고 있기 때문에 직접적으로 데이터를 공유할 수 없다. 따라서 자원을 공유하고 통신하기 위한 방법이 필요하다. 이러한 프로세스간 통신을 위한 방법을 IPC(Inter...
운영체제는 다수의 프로세스를 효율적으로 실행하기 위해 프로세스의 생명주기를 제어하는 프로세스 스케줄링 기능을 수행한다. 프로세스 스케줄링은 역할별로 단계를 나누어 new, ready, running, wait, suspend 상태로의 이전을 관리한다.
Stack Stack(스택) 자료구조는 이름 그대로 쌓아올리다와 같은 의미이다. 예를 들어, 책상위에 쌓인 책과 비슷한 구조라고 할 수 있다. 밑에서 책을 차곡차곡 올리고 뺄때는 위에서부터 빼낸다. 이러한 구조를 후입선출(LIFO, Last-In-First-Out) 구조라고 부른다...
Array와 List는 다수의 데이터를 저장하고 조작하는 기본적인 자료구조이자 다른 자료구조들을 구현하기 위해 중요한 자료구조이다.
우리가 컴퓨터를 사용할때 브라우저, 카카오톡 등 여러가지 응용 프로그램을 사용한다. 각 프로그램들은 실행되기 위해서 메모리 공간과 자원을 할당받아야하고 실행된 후에도 지속적으로 관리되어야 하는데 이와 같은 과정을 운영체제가 처리해준다. 즉, 운영체제는 메모리와 CPU를 사용하여 프...
자료구조는 다수의 데이터를 시간,메모리 효율적으로 처리할 수 있도록 도와준다. 자료구조의 성질을 잘 알고 있다면 상황에 맞춰 필요한 자료구조를 사용함으로써 효율적인 처리가 가능할 것이다. 다수의 데이터들을 효율적으로 처리하기 위한 여러가지 메커니즘, 자료구조에 대해서 알아보자
네트워크 액세스 계층(물리 계층 + 데이터 링크 계층)은 연결된 장치들 간에 직접적으로 통신을 하며 제어하는 역할을 한다. 바로 윗 계층인 인터넷계층이 경로를 확인한다면 탐색된 경로로 데이터를 내보내는 것이다. 이 계층에서는 통신 중 발생하는 문제들을 제어하는 기능을 가지고 있다....
IP는 총 32비트로 이루어진 주소체계다. 인터넷이 빠르게 발전함에따라 기존에 존재하는 IP 주소가 부족해지기 시작했다. 이에 여러가지 해결책들이 제시되었고 공식적으로 사용하고 있다.
인터넷(네트워크) 계층은 IP 주소를 이용해 최종 목적지까지 이동하는 역할을 맡는다. 방대한 인터넷에서 네트워크 간의 이동을 라우터가 처리해주며 그 과정에서 IP를 이용한다. 인터넷 계층의 핵심 프로토콜인 IP와 경로 라우팅을 위한 핵심 장비인 라우터에 대해서 알아보자.
네트워크의 여러 장비들을 거쳐 데이터 통신을 하는 방식에는 대표적으로 두 가지 매커니즘이 존재한다. 회선을 독점하여 사용하는 회선교환 방식과 데이터를 패킷으로 나누어 전송하는 패킷교환 방식이다.
앞선 포스트에서 TCP가 원활한 소통을 위해 흐름제어, 혼잡제어, 오류제어라고 불리는 전송제어방법을 사용하고 있다고 했다. 이번 포스트에서는 각 제어방법들이 가지고 있는 여러가지 메커니즘을 알아보자.
전송계층은 네트워크에서 데이터를 안정적으로 전송하기 위한 계층으로 신뢰성 있는 데이터 전송을 보장하는 역할을 한다. 전송계층의 아래계층들은 목적지 컴퓨터까지 전송을 해주는 역할을 하지만 목적지 도착 이후에 데이터의 확인을 하지는 않는다. 전송계층은 양 끝단에서 수문장의 역할로서 데...
OSI 7계층, TCP/IP 4계층 두 용어는 네트워크의 동작과정을 설명해주는 대표적인 모델들이다. 두 모델의 공통적인 특징은 역할을 계층으로 나누어 설명하고 있다는 것이다. 이러한 모델은 복잡한 네트워크의 원리를 쉡개 이해할 수 있도록 도우며 네트워크 동작 과정 중 문제가 생겼을...
원하는 사이트에 접속하기 위해 주소창에 www.naver.com, www.youtube.com등의 도메인을 입력하면 화면이 브라우저 창에 띄워진다. 우리는 인터넷상에서 서버의 위치를 찾기 위해선 IP주소가 필요하다는 것을 알고 있다. 그렇다면 어떻게 도메인 주소만으로 IP를 찾아낼...
HTTP(Hpyertext Transfer Protocol)는 인터넷에서 데이터를 전송하기 위한 프로토콜이다. 클라이언트와 서버 간의 상호작용을 위해서 설계되었고 인터넷상에서 여러가지 타입의 리소스들을 주고받을 수 있다.
기존 HTTP 방식은 전송 중 데이터를 가로챈다면 누구나 데이터를 읽을 수 있다. 즉, 데이터가 암호화되지 않은 상태로 인터넷상에서 돌아다닌다는 것이다. 이러한 보안문제를 해결하기 위해 통신데이터를 암호화하여 안전하게 데이터를 통신하는 방법이 HTTPS이다. HTTPS를 사용하면 ...
HTTP(Hyper Text Transfer Protocol)는 인터넷상에서 데이터를 주고받기 위한 프로토콜이다. HTTP는 오래전부터 인터넷상에서 사용되어져 왔는 만큼 여러 버전이 나오며 개선되어졌다. 현재는 대부분 HTTP 1.1을 사용하며 몇몇 IT기업에서는 2.0, 3.0까...
운영체제는 컴퓨터 시스템의 자원들을 효율적으로 관리하고 사용자가 컴퓨터를 편리하게 사용할 수 있도록 도와준다. 응용프로그램, I/O디바이스들이 사용하고자 하는 하드웨어 자원들을 효율적으로 사용할 수 있도록 그 사이에서 자원관리를 한다고 볼 수 있다. 운영체제의 역할을 정리하자면 아...
운영체제는 프로그램들을 동작시키기 위해 하드웨어 리소스들을 할당받아 사용한다. 뿐만아니라 프로세스를 관리하고 메모리를 효율적으로 사용하기 위해 여러 가지 기술들을 사용한다. 우리들의 프로그램이 시작될때 운영체제에서는 어떤 일이 일어날까? 그 과정을 이해해보자.
네트워크란 무엇일까? Net와 Work의 합성어로써 컴퓨터들이 통신기술을 이용하여 그물망처럼 연결된 형태이다. 우리는 다른 사람들에게 파일을 공유하거나 어플리케이션을 이용하여 음악을 듣고 온라인에서 다른 사람을 만나 게임을 즐길 수 있다. 이 모든 것은 컴퓨터끼리 연결된 네트워크가...
브라우저 주소창에 https://www.naver.com 을 검색하면 어떤 과정을 거치게 될까? 내 컴퓨터에서부터 목적지를 찾아 이동하고 필요한 정보들을 받아온다. 이 과정에서 여러 장치들을 거치고 안정적인 커뮤니케이션을 위한 여러 기술들이 사용된다. 검색 후 우리들의 노트북에 화...
자바에서 추상화를 지원하는 개념으로 인터페이스와 추상 클래스가 있다. 비슷해 보이지만 엄연히 목적이 다른 두 개념의 차이를 알아보자.
객체지향 프로그래밍은 장점은 복잡성을 객체 안에 내재화시키고 객체간의 유연한 협력을 통해 프로그램을 단순하고 변경이 용이하게 만들어 준다는 것이다. 잘 알려진 객체지향 프로그래밍의 특징들은 이러한 장점을 잘 살릴 수 있도록 방향성을 제시해준다.
자바로 개발을 시작한다면 class를 만들고 main함수를 작성하는 필수적인 코스를 거친다. 이 두가지는 무슨 의미가 있는 알아보자.
Java 개발을 시작할때 필연적으로 JDK, JRE, JVM과 같은 개념들과 부딪히게 된다. 이 포스팅에서는 이 개념들의 대해 정리해보았다.
Java는 1996년 Sun Microsystems의 제임스 고슬링에 의해 탄생하게 되었다. 당시 인터넷의 발전으로 여러 운영체제가 등장하였고 이러한 상황은 운영체제에 독립적이었던 Java가 떠오르는 계기가 되었다.
JavaScript의 모듈시스템은 여러 단계를 거쳐 진화해왔다. 그 중에서는 require 키워드를 이용하여 모듈을 불러오는 CommonJS와 import를 키워드를 이용하는 ESM 기반의 모듈시스템을 많이 사용하고 있다.(CommonJS는 node.js에서 사실상 표준, ESM은...
모듈이란 무엇인가? 모듈은 애플리케이션을 구성하는 개별적 요소로서 재사용 가능한 코드 조각을 말한다. 보통 모듈은 기능을 기준으로 파일로 분리한다. 단순 분리뿐 아니라 각 모듈파일은 자신만의 파일 스코프를 가질 수 있어야 하며, 필요한 부분만을 노출시켜 외부에서의 접근범위를 제한할...
프론트 개발자들에게 Babel과 Webpack은 친숙한 도구들일 것이다. 상용 서비스를 개발한다면 적어도 한 번쯤은 들어봤을만큼 중요한 도구들이다. 빠르게 진화하는 프론트세계에서 과거의 유물(구형 브라우저)들에 대한 호환성을 제공하는 매우 유익한 도구들이다. 이 포스트에서는 Bab...
Javascript는 프론트에서나 백엔드에서나 유용하게 쓰이는 프로그래밍 언어이다. 하지만 Javascript는 동적 타입 언어이기 때문에 변수에 타입이 지정되어 있지않아 타입에러가 쉽게 발생하며 에러를 발견하기도 쉽지 않다. 다수의 개발자가 협업 시 더욱 자주 발생하며 결국 안정...
소프트웨어를 개발하고 배포했을때 코드가 원하는대로 동작한고 바라던 결과를 낸다면 좋겠지만 그렇지 않은 경우도 많다. 프로젝트가 복잡해질수록 그러한 상황이 빈번하게 발생할 것이다. 이러한 문제를 해결하기 위해 많은 개발자들이 테스트 코드 작성을 지향하고 있다.
AWS를 이용해서 서버 하나를 구동시키기 위해선 몇가지 필수 자원생성 및 설정이 필요하다. 정말 순수하게 서버를 구동시키기 위한 인프라를 Terraform으로 구현해보자. 먼저 구현할 인프라를 도식화한 이미지를 보자.
Nest에서 현재 진행중인 환경에 대한 정보를 가져올 수 있는 유틸리티 클래스들을 제공해준다. 대표적으로 ArgumentsHost와 ExecutionContext 클래스가 존재한다.
IaC 도구 중 하나인 Terraform은 선언형 언어(HCL)을 사용하고 불변성, 멀티 클라우드 관리가 가능하다는 장점을 가지고 있다. 이러한 장점 덕분에 많은 개발자/팀들이 인프라 프로비저닝 도구로써 사용하고 있다. 이 글에서는 Terraform 설치부터 테라폼을 사용하기 위한...
출처: nestjs
클라우드로 인프라를 구성할때 AWS의 경우 console(AWS 웹페이지)를 이용하여 자원을 생성/수정/삭제한다. 여기에는 큰 단점이 존재하는데 자원을 생성한 사람만이 해당 자원의 정보를 알 수 있으며 인프라가 커져감에 따라 복잡도를 제어하기 힘들다는 것이다. 이러한 단점을 극복한...
몇 년 전부터 클라우드가 급부상하였다. AWS, Azure, Google Cloud Platform 등 클라우드 서비스 제공업체들도 많이 생겨났고 많은 개발자/기업들이 클라우드 서비스를 이용하고 있다. 필자도 클라우드를 애용하지만 개념에 대해 제대로 조사해본 적 없었고 블로그 첫글...
Github Pages를 블로그를 이전하였다. 이전엔 Tistory, Velog 두 플랫폼을 이용하다가 이번에 도메인까지 구입하고 Github Pages로 넘어오게 되었다.