분류 전체보기
-
[Spring Boot] 추가 설정 파일 사용하기(.properties .yml)Spring 2022. 9. 18. 18:05
스프링 부트는 설정 파일 형식으로 .properties 또는 .yml(.yaml) 파일 형식으로 설정파일을 작성할 수 있다. 또한 src/main/resources 디렉토리 하위에 있는 application.properties 파일에 있는 설정 값들을 런타임에 불러오기 때문에 별다른 설정 없이 설정 값들을 사용할 수 있다. 설정파일에 등록된 설정값은 다음과 같이 Bean 내부에서 @Value 어노테이션을 통해 값을 주입받기도 한다. @Getter @Component public class Device { private String model; private Integer serialNo; public Device( @Value("${device.model}") String model, @Value("${..
-
[Docker] 개발용 데이터베이스 띄우기(MySQL, PostgreSQL, MongoDB)Backend 2022. 3. 27. 13:20
실무에서 프로젝트를 진행할때나 개인 프로젝트를 진행할 때 로컬에 데이터베이스를 띄워야 하는 경우가 있다. 그런데 프로젝트마다 필요한 데이터베이스도 다르고, 같은 데이터베이스라도 여러 설정이 달라야할 수 있다. 이때 프로젝트별로 필요한 데이터베이스 환경을 컨테이너로 만들어놓으면 굉장히 편리한데, 특히 협업을 하는 경우 이 환경을 docker-compose.yml 파일로 만들어놓으면 동일한 데이터베이스 환경에서 개발을 할 수 있다. Docker Compose를 이용해서 오픈소스 데이터베이스 3대장인 MySQL, PostgreSQL, MongoDB를 띄우는 방법을 알아보자. MySQL MySQL을 docker-compose로 띄우기 위한 기본 설정은 다음과 같다. version: "3.9" services: ..
-
[JS] 알쏭달쏭 자바스크립트 this 바인딩Javascript, Typescript 2022. 3. 19. 14:51
Java, C# 같은 객체지향 프로그래밍 언어들은 this라는 키워드를 사용한다(Python 에는 self라는 키워드가 있다). 이때 this가 의미하는 것은 해당 코드를 실행하는 클래스의 인스턴스를 나타낸다. 자바스크립트에도 this라는 키워드가 있는데 자바스크립트의 this는 앞선 개념에 익숙해져있는 사람이 이해하기에는 다소 까다로운 개념이다. 마치 학부 초창기에 C언어 수업에서 포인터를 만났을 때 벽을 느꼈던 것처럼, 처음 자바스크립트의 this를 만나게 되면 혼란스러움에 벽을 느끼게 된다. 도대체 자바스크립트에서는 this를 어떻게 사용해야 하는지 알아보자. Javascript의 this 바인딩 function foo() { const a = 10; console.log(this.a); } foo..
-
[TypeORM] QueryBuilder 사용시 return 타입 구체화하기Javascript, Typescript 2022. 2. 10. 17:28
QueryBuilder의 getOne(), getMany()를 이용해서 데이터를 조회할 때 리턴되는 객체의 타입은 항상 엔티티 클래스의 인스턴스이다. 그렇기 때문에 특정 컬럼들만 가져오는 경우, 잠재적인 문제가 일어날 수 있다. 반환되는 객체가 엔티티의 인스턴스인 경우 일어날 수 있는 문제는 무엇이고 이것을 어떻게 해결할 수 있는지 알아보자. 가능한 문제상황 데이터베이스에 게시글(Post)이 등록되어있고, 이 게시글들의 목록을 조회하는 API를 개발해야한다. 이때, 게시글의 목록에서는 게시글의 내용(content)은 가져올 필요가 없다. 위와같은 요구사항이 있고, Post 테이블의 스키마는 다음과 같다. 데이터는 3개만 넣어놓았다. 다음과 같이 Entity를 정의한다. @Entity() export cl..
-
[Node.js] 공식문서로 이해하는 이벤트 루프Node.js 2022. 2. 3. 17:37
Node.js의 공식문서 중에 아쉽게 한글화가 되어있지 않은 흥미로운 가이드가 하나 있다.(링크) Don't Block the Event Loop라는 타이틀에서 알 수 있듯이 자바스크립트, 특히 Node.js 환경에서 동작하는 어플리케이션을 만들 때 가장 중요한 이벤트 루프에 대해 깊게 이해할 수 있는 공식 가이드이다. 서버사이드 Node.js 어플리케이션을 만들기 위한 여러 가지 고려사항들과 설계 원칙들을 확인할 수 있는데, 해당 가이드를 읽고 배운것들 중 일부와 Node.js의 이벤트 루프에 대해 개인적으로 알고 있던 것들을 간단하게 정리하려고 한다. Event Loop 자바스크립트는 싱글 쓰레드 언어이기 때문에 여러 작업을 작업을 동시에 처리할 수가 없다. 이런 문제를 해결하기 위해 자바스크립트 런..
-
[TS] 모듈 import 경로에 별칭 사용하기(VS Code)Javascript, Typescript 2022. 1. 26. 23:38
Typescript나 Javascsript를 사용할 때 디렉토리 계층이 깊어질수록, 다음과 같이 지저분한 import 문의 경로를 경험할 수 있다. 모듈의 경로를 표현할 때 사용자의 개발환경에 의존적인 절대경로가 아닌, 현재 스크립트 파일을 기준으로 한 상대 경로가 사용되기 때문에 이와 같은 경로가 된다. 이런식으로 표현된 경로들은 다음과 같은 문제점이 있다. 프로젝트의 루트 경로를 기준으로 어느 경로에 있는 모듈인지 파악하기가 힘들다. 현재 파일의 경로가 바뀌면 import 문의 모듈의 경로를 바뀐 경로를 기준으로 다시 작성해 주어야 한다. 하지만 타입스크립트의 tsconfig를 조금만 수정하면 프로젝트의 루트 경로를 기준으로 절대경로로 표현할 수 있다. 이때 이 절대경로를 별칭(alias)라고 부른다..
-
[OOP] Tell, Don't Ask(TDA) 원칙과 캡슐화Software Design 2022. 1. 18. 22:59
Tell, Don't Ask. 객체에게 데이터를 요구(Ask) 하지 말고, 객체에게 일을 시켜라(Tell) 정도로 해석할 수 있다. 객체 지향적 사고방식 원칙 중 하나인데, 특히 객체지향의 핵심인 캡슐화가 잘 이루어진 설계를 하기 위해서 탄생한 원칙이다. 다음 User 클래스를 통해 캡슐화가 이루어지지 않은 객체의 문제점을 알아보고, TDA 원칙을 통해서 캡슐화를 시켜보자. class User { public email: string; public age: number; public createdAt: Date; } 어떤 문제가 있을까? 어떤 비즈니스 로직을 수행할 때, 사용자의 나이가 20보다 작다면 오류가 나야 한다는 요구사항이 있다고 하자. User객체를 매개변수로 전달받는 서비스 메소드에 이 요구..
-
[TypeORM] Entity의 constructor를 사용할 수 있을까?Javascript, Typescript 2022. 1. 13. 23:56
TypeORM의 Entity에 대한 공식문서를 찬찬히 읽어보면 다음 문구를 찾을 수 있다. 엔티티 생성자의 인자들은 반드시 옵셔널이어야 한다라니... 굉장히 의미심장한 문구가 아닐 수 없다. 다른 말로는 생성자의 인자들은 반드시 nullable 이어야한다 라고 생각할 수 있다. 그렇다면 인스턴스 생성시에 유효성 검증은 어떻게 하지? 이 경고가 의미하는 것이 무엇인지, 그리고 문제를 해결할 수 있는 방법은 무엇인지 알아보자. 무슨 소리일까? 다음과 같은 간단한 엔티티가 있다. @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @Column() age: number; } TypeORM의 Gett..