Web

· Web/Spring
Spring Cloud Gateway는 애플리케이션 실행 시 스프링부트에 내장되어 있는 Tomcat이 아닌 Netty 기반의 비동기 통신을 지원하는 형태의 웹 애플리케이션으로 실행된다. 분명 Spring Cloud Gateway 의존성을 추가해줬기 때문에 Netty로 실행되어야 하는데 여전히 Tomcat으로 실행된다... 간단하게 문제를 해결해보자. 문제 상황 환경 Java 17 SpringBoot 3.2.1 Spring Cloud 2023.0.0 gradle 분명 위와 같이 스프링부트 프로젝트를 생성할 때 Gateway dependency를 추가해준 후 프로젝트를 실행했지만, 아래와 같이 Tomcat이 애플리케이션을 구동한다. 뿐만 아니라 아래와 같이 Spring Cloud Gateway 라이브러리에 ..
· Web/Spring
스프링부트를 이용해 프로젝트를 생성하고 별도의 설정을 건드려주지 않으면 로그는 info 단계 상위만 출력된다. (로그 단계 순서: trace-debug-info-warn-error) 따라서 만약 그 하위 로그 단계도 출력하고 싶다면 별도로 설정을 변경해주어야 한다. 현재 스프링 생태계에서 많이 사용되는 로깅 라이브러리로 logback과 slf4j가 있고, 이 두 라이브러리의 설정을 건드려주면 로깅에 대한 설정을 변경할 수 있다. 오늘은 이 두 라이브러리가 아닌, 간단하게 속성파일을 변경하여 외부 설정정보를 바꿔주는 방법으로 출력 로그 단계를 변경해보고자 한다. application.properties: 스프링부트가 동작하는데 필요한 설정정보를 담아두는 파일로, 외부 설정 정보를 변경해줄 수 있다. 예전에..
· Web/Spring
이전에 들었던 김영한님의 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 강의에 대해 복습을 하기 위해 요약을 해보았다. 라이브러리 Apache 클라이언트에서 요청하는 HTTP 요청을 처리하는 웹서버 정적타입(HTML, CSS, 이미지 등)의 데이터만을 처리하기 때문에 톰캣이 등장하게 되었다. Tomcat(톰캣) WAS Java EE 기반으로 만들어져, JSP와 Servlet을 구동하기 위한 서블릿 컨테이너 역할을 수행한다. 컨테이너란? 동적인 데이터들을 가공하여 정적인 파일로 만들어주는 모듈 서블릿(servlet)이란? 클라이언트의 요청을 받고 요청을 처리하여 결과를 클라이언트에게 제공하는 자바 인터페이스. java.servlet.package에 정의된 인터페이스로서 서블릿..
옵셔널 체이닝 연산자 ES11(ECMAScript2020)에서 도입된 옵셔널 체이닝(optional chaning) 연산자 ?. 는 좌항의 피연산자가 null 또는 undefined 인 경우 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다. 예제는 다음과 같다. var elem = null; var value = elem?.value; console.log(value); // undefined 옵셔널 체이닝 연산자가 등장하기 전에는 논리 연산자 && 를 활용해 단축 평가를 했었으나, 옵셔널 체이닝 연산자를 활용하면 좀 더 깨끗한 코드를 작성할 수 있다. 하지만 논리 연산자 && 를 활용하는 것과 옵셔널 체이닝 연산자 ?. 를 활용하는 것에는 분명한 차이가 있는데, 다음과 같다..
변수 호이스팅 console.log(number); var number; 위의 코드를 실행해보면 console.log(number); 는 어떤 값이 출력될까? 자바스크립트를 처음 접한다면 ‘당연히 에러가 발생하지 않을까?’ 라고 생각할 수 있다. 하지만 undefined 가 출력된다. 분명 자바스크립트의 소스코드도 여느 프로그래밍 언어와 마찬가지로 한줄씩 차례대로 실행되는데 어떻게 이게 가능한걸까? 바로 자바스크립트의 호이스팅에 의해 그렇다. 호이스팅에 대해 알아보고자 한다. 호이스팅(Hoisting)은 변수 또는 함수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징이다. 따라서 위의 코드를 살펴볼 때, 실제 동작 순서는 number 변수가 선언되고 나서 콘솔 코드가 실행되게..
· Web/정보
API를 작성하는데 있어서 로그인은 보안과 직결되기 때문에 가장 중요한 부분 중 하나이다. 그렇다면 로그인을 어떻게 안전하게 처리할 수 있을까? 그 부분에 대해 정리하고자 한다. 로그인 API가 보다 복잡한 이유는 우선 HTTP의 특성과 관련이 있다. HTTP는 무상태성이라는 특성을 지니고 있는데, 클라이언트에 대한 이전 상태 정보 및 현재 통신 상태가 남아있지 않다. 따라서 이를 해결하고자 로그인 방식이 별도로 존재하는 것이다. 로그인 방식 3가지 쿠키 & 세션 JWT OAuth 쿠키 클라이언트가 어떠한 웹사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버를 통해 클라이언트의 브라우저에 설치되는 작은 기록 정보 파일 무상태 환경에서 기억하고자 하는 데이터를 쿠키에 담고, 다음 번 요청 시에 쿠키를 ..
NestJS 개발 환경 세팅 새로운 프로젝트 만들기 $ npm i -g @nestjs/cli $ nest new project-name 위와 같이 package.json을 비롯하여 여러 파일이 생성된다. src 하위에는 여러 파일로 나뉘어져 있고 app.controller.ts의 경우 app.controller.ts를 테스트하는 파일이다. controller: express에서의 router와 유사한 개념 - 라우팅 service: express에서의 service와 유사한 개념 - 비즈니스 로직 // app.controller.ts import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @C..
· Web/정보
정적 웹페이지 vs 동적 웹페이지 웹페이지는 크게 정적 웹페이지와 동적 웹페이지로 나눌 수 있는데, 정적 웹페이지는 클라이언트가 서버에 요청을 할 때, 서버는 별도의 처리과정 없이 반환값을 제공한다. 따라서 모든 사용자가 동일한 화면을 보게 된다. 반면 동적 웹페이지에서는 서버가 클라이언트의 요청값에 대해 일련의 수행과정을 거친 후 반환값을 제공한다. 이 경우 사용자들마다 다른 페이지를 볼 수 있다. 동적 웹페이지도 페이지를 제공 - 레거시화 되어가고 있다. 동적 웹 페이지에서 정적 웹 페이지로 바뀌는 이유: 서버 부하 줄이기 MPA vs SPA 여기서 MPA(Multiple Page Application)과 SPA(Single Page Application)의 차이와도 연관이 있다. 단순하게 텍스트 그..
말도 못하는 감자
'Web' 카테고리의 글 목록