본문 바로가기

Web/웹 상식

(26)
[GraphQL] GraphQL 처음 시작하기 GraphQL이 뭘까? GraphQL은 페이스북에서 만든 쿼리 언어입니다. 소식에 조금 늦은 저는 2020년에 처음 들었는데 최근 들어서 GraphQL 소식이 자주 들려오고 있습니다. 현재의 인기는 어느 정도일까요? 아래의 그래프를 보면 GraphQL에 대한 관심도가 어느 정도인지 알 수 있습니다. 꾸준하게 사람들에게 언급되고 배우려고 하는 사람, 사용하고 있는 사람들이 많이 늘고 있습니다. 일단 GraphQL은 뒤에 QL이라고 붙는 것을 보면 SQL(Structed Query Language)과 마찬가지인 것 같은데 사용되는 예시를 살펴보면 매우 다릅니다. GraphQL은 웹 클라이언트와 서버 사이에 사용되고 SQL은 서버와 데이터베이스 사이에 사용됩니다. 그래서 웹 데이터를 처리하는 방법인 REST와..
HandlerMethodArgumentResolver에 대해서 Spring을 활용해서 웹 개발을 하던 중 의문이 생겼습니다. Controller에서 Parameter를 받을 때 Model을 넣어주면 해당 Model의 생성자는 어디에 있지? 객체가 생성되어 있고 값이 들어가 있는데 생성자는 어디에 있는지 알 수가 없었습니다. 그러다 찾은 것이 HandlerMethodArgumentResolver입니다. HandlerMethodArgumentResolver Spring에서 제공하는 인터페이스 중 하나로 컨트롤러에서 특정 조건에 맞는 파라미터에 원하는 값을 바인딩 해주는 역할을 합니다. 위의 상황과 같이 Model이 파라미터라면 모델 객체를 생성하고 값을 넣어서 반환해주는 것이 이 인터페이스의 역할입니다. Custom HandlerMethodArgumentResolver..
Java의 직렬화란 1. 직렬화(Serialization)란? 직렬화의 정의는 데이터구조나 오브젝트 상태를 동일하거나 다른 컴퓨터 환경에 저장하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정입니다. 즉, 다른 환경으로 데이터를 전송하거나 저장할 때 서로 재구성할 수 있는 형태로 변환하고 역변환하는 것을 직렬화/역직렬화라고 합니다. 2. Java에서의 사용 Java에서 사용하는 곳은 다른 곳으로 전송 혹은 전송 받을 때 사용하거나 특정 객체를 영속화(메모리가 아닌 영속적인 디스크에 저장할 때) 사용한다. 예를 들어보면 Java 에서는 ObjectOutputStream 클래스로 객체를 저장할 수 있는데 이때 매개변수로 넘길 수 있는 것은 Serializable의 구현체만 가능하다. 즉, 직렬화가 가능하도록 한 객체를 byt..
HTTP/3에 대해서 HTTP/2도 이제야 막 알아가던 시점인데 벌써 3이라니! HTTP3.0이 2020년 10월에 추가되었습니다. 어떻게 이렇게 소문도 없이 나왔는지 모르겠습니다. 그래서 이제서라도 알아보려고 정리해봅니다. 이전의 HTTP https://marrrang.tistory.com/38?category=925235 이것도 한번 참고해보시면 좋을 듯합니다 ㅎㅎ HTTP/3을 보기 이전에 HTTP/2에 대해서도 잘 모르니 짚고 넘어가겠습니다. HTTP1.1을 사용하던 때와 다르게 리소스들이 증가하였고 점점 더 병렬 수행하는 것이 중요해짐에 따라서 개선이 필요했습니다. 기존에는 Plain Text(평문)을 사용했지만 2.0부터는 바이너리 포맷으로 인코딩 된 Message, Frame으로 구성되었습니다. 1.0에 비해서 ..
Redis에 대해서 Redis는 무엇일까? 정의는 메모리 기반의 Key-Value 구조의 데이터 관리 시스템 Memcache와 차이점 그리고 종종 MemCache와 종종 비교됩니다. 그럼 MemCache를 잠시 살펴봅시다. MemCache의 특징들은 아래와 같습니다. 처리속도가 빠르다 => 디스크를 거치지 않기 때문에 빠르다 휘발성을 가진다 => 프로세스가 죽거나 장비가 꺼지면 데이터가 사라진다 메모리를 재사용한다 => 메모리가 부족하면 LRU 알고리즘에 의해 데이터가 사라진다 그리고 MemCache와 비교되는 Redis도 위와 같은 특성을 그대로 가지게 됩니다. 하지만 조금씩 다릅니다. Redis와 MemCache의 차이점 데이터를 메모리 + 디스크 혹은 다른 서버 메모리에 저장한다. 따라서 프로세스가 죽어도 데이터가 저..
Design Pattern 디자인 패턴에 대해서 0. 디자인 패턴이란 소프트웨어 설계 문제에 대한 해답을 문서화하기 위해 고안된 형식 위키에서는 위와 같이 표현되어 있습니다. 조금 어렵게 들리기도 하네요. 제가 이해한 바로는 좋은 코드를 만드는 방법들이라고 이해하게 되었습니다. 좋은 코드는 각자의 스타일에 따라 다르겠지만 통상적으로는 아래의 특징들을 가진 코드를 좋은 코드라고 합니다. 좋은 코드 가독성이 좋음 간결함 확장과 수정에 용이 유지 보수가 편함 결합도가 낮음 응집도는 높음 ... 디자인 패턴은 좋은 코드를 만드는 방법이라고 했으니까 위의 특징들을 만족시키는 코드 설계 방식이겠습니다. 그리고 디자인 패턴보다 객체지향의 5대 원칙을 먼저 보는 것이 다음의 이해를 위해 좋습니다. 1. 디자인 패턴 종류 생성 패턴 (Creational Pattern..
[Spring] 스프링 DI(Dependency Injection)은 어떻게 이루어지나 IoC (Inversion of Control) DI를 알아보기 전에 알아야 할 용어가 IoC입니다. IoC는 "제어의 역전"이라는 말로 메서드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 의미합니다. 여기서 외부는 Spring Framework입니다. 기존에는 객체를 클래스 내부에서 생성하고 사용했지만 IoC를 적용하면 미리 생성해놓은 객체를 주입받아 사용하기만 하면 됩니다. 이를 통해 얻을 수 있는 장점은 아래와 같습니다. 제어의 역전의 장점 객체 간 결합도를 낮춘다 유연한 코드 작성 가능 가독성 증진 코드 중복 방지 유지 보수 용이 DI (Dependency Injection) 위에서 알아본 IoC에서 객체를 주입받아 사용한다고 했습니다. 바로 이것이 DI이죠. 즉, ..
SPA에 대해서 (Single Page Application) 단일 페이지 애플리케이션(Single Page Application)은 웹, 앱에서 점점 많은 정보를 제공하는 추세에 따라 발전된 모던 웹의 패러다임입니다. 정보가 많아질수록 웹을 로딩하는데 비용이 많이 들어가게 되고 사용자 경험이 점점 안좋아지게 됩니다. 따라서 해결책이 필요해지게 된거죠. 기존에는 Link Tag 방식을 사용했습니다. 우리가 아는 링크를 클릭하게 되면 다른 페이지로 이동하게 됩니다. 그리고 그 링크에 대한 URL은 각각 다르게 설정되어 있죠. 이 방식은 각 URL에 해당되는 화면에 대한 리소스를 전부 구성하여 내려주게 됩니다. 이것이 서버 렌더링 방식이죠. 서버에서 렌더링하여 클라이언트에게 보내주게 됩니다. 서버 렌더링 방식은 새로운 페이지 요청마다 정적 리소스를 다운로드하게 되고 전..
도메인 주도 설계 (Domain Driven Development)에 대해서 DDD에 대해서 알아가면 알아갈수록 개념을 하나로 잡기가 어렵다는 걸 느끼게 됐습니다. 여러 블로그에서 DDD에 대한 정보를 검색해봐도 정확한 적용방식이나 개념이 이해가 가지 않아서 정리하게 된 글입니다. 저와 같은 분들에게 도움이 되면 좋겠습니다. DDD란 뭘까? DDD란 말 그대로만 보자면 도메인 패턴을 중심에 놓고 프로그램을 설계해가는 방식을 의미합니다. 이러한 설계 방식을 올바르게 적용한다면 도메인 모델이라고 하는 소프트웨어 추상화를 달성할 수 있게 되고 이것이 목표인 설계 방식이라고 보여집니다. 그럼 도메인은 뭘까요? Domain (도메인) 도메인 - 영어 단어로써의 의미는 영토, 영역, 범위를 의미합니다. 프로그래밍 부분에서 의미는 소프트웨어 프로그램이 제공하는 기능 중 하나(영역)입니다. 도..
Java에서 외부 프로세스 실행하기 Apache Commons Exec 이용 1) dependency 추가 org.apache.commons commons-exec 1.3 2) 실행 예시 public void execute(String[] command) throws IOException,InterruptedException { DefaultExecutor executor = new DefaultExecutor(); CommandLine cmdLine = CommandLine.parse(command[0]); for (int i=1, n=command.length ; i