분류 전체보기
팀 프로젝트가 나에게 남긴 것
시작 처음으로 팀 프로젝트를 해보며 깨달은 점이 많았다. 팀 안에서 얻어간 교훈과 팀에서 어떤 역할을 해야 할 지에 대한 고민이 담겨있는 글을 적어보려고 한다. 같이 고민하기 방학 중에 팀 아이디어를 내는 시간이 있었다. 당시에 나는 칭찬 하나 없이 다른 크루의 아이디어가 안될 것 같은 점만 말했다. 팀 아이디어 하나에 7명의 몇 개월이 달려있다고 생각하고 혼자 심각했던 것 같다. 그때는 나름 이 방식이 맞다고 착각했었다. 그런데 소통하는 방식에 대한 글을 여러 개 읽고 생각이 많이 바뀌었다. 도메인 지식 탐구를 위한 이벤트 스토밍이라는 기법이 있다. 이벤트 스토밍의 첫 단계는 토론하지 않고 각자가 자신이 옳다고 생각하는 방식을 기록하는 시간을 보장하는 것이다. 이 방식을 알고 큰 충격을 받았다. 아이디..
CIDR 읽는 법과 원리
CIDR(Classless Inter-Domain Routing) VPC와 서브넷이라는 개념을 이해하기 위해서는 먼저 CIDR 블록 표현 방식을 이해해야 합니다. 위에서 언급했듯 우리는 다른 네트워크와 분리된 네트워크를 만들 필요가 있습니다. CIDR는 32비트로 표현되는 IPv4를 나누기위한 방법중 하나입니다. IPv4를 나누기위한 방법 클래스 구분 법 CIDR 기존의 클래스 구분법을 사용하면 서브넷 마스크는 8자리로만 끊기게 되어 낭비되는 IP들이 존재하게 됩니다. CIDR는 기존의 클래스로만 구분된 네트워크의 한계를 극복하기 위한 수단으로 개발되었습니다. CIDR는 IPv4주소의 4개의 옥텟그룹 뒤에 /숫자 를 붙이면서 표현합니다. xxxxxxxx.xxxxxxxxx.xxxxxxxxx.xxxxxxxx..
[AWS] amazon EC2 생성을 위해 알아야 할 개념들
저번 포스팅에서는 클라우드 컴퓨팅과 AWS에 대해서 간단하게 정리해보았습니다. 2022.07.31 - [CS/네트워크] - [AWS] 클라우드 컴퓨팅과 AWS 이번 포스팅에서는 AWS EC2를 만들기 위해서 알아야 할 개념들을 정리해보겠습니다. AWS EC2 설정 애플리케이션 및 OS 이미지 Amazon Machine Image(AMI) aws ec2에는 인스턴스를 시작하는 데 필요한 소프트웨어 구성(운영체제, 어플리케이션서버, 어플리케이션)들을 선택할 수 있는 AMI가 존재합니다. 인스턴스를 시작할 때 AMI를 지정해야 합니다. 인스턴스 유형 aws ec2에서는 원하는 컴퓨팅, 메모리, 네트워킹 또는 스토리지 요건에 맞는 여러 인스턴스 유형을 선택할 수 있습니다. 현재 제가 서비스에 사용하고있는 t4g..
[AWS] 클라우드 컴퓨팅과 AWS
웹 어플리케이션 서비스를 실제로 배포해보면서 AWS의 클라우드 컴퓨팅 기술을 이용하게 되었습니다. 배포할때 왜 클라우드를 이용하게 되었는지, 또 클라우드 컴퓨팅 기술로 AWS의 EC2를 이용하면서 공부한 개념들을 정리하려고 합니다. 클라우드 컴퓨팅 클라우드 컴퓨팅이 뭘까요? 간단하게 말하면 “인터넷을 통해 연결된 원격 컴퓨터를 활용하는 기술”입니다. 그렇다면, 왜 개인 PC가 있지만 원격으로 연결된 컴퓨터를 활용하는 기술이 필요할까요? 클라우드 컴퓨팅이 없다면 불편한 상황들이 발생합니다. 제 웹 어플리케이션을 제 컴퓨터에 올려놓고 제 컴퓨터에 어디서든 접근할 수 있도록 public IP를 열어놔야 합니다. 또한, 클라이언트가 언제든지 접속할 수 있도록 항상 제 컴퓨터는 켜져있어야 합니다. 하지만 클라우드..
로깅 도입
log4j2 도입 터놓고 서비스를 개발하면서 배포환경에서는 콘솔에 로그를 남길 수 없었습니다. 콘솔에 로그를 남기면 휘발되기도 하고 나중에 확인하기 어려웠습니다. 그래서 log파일로 남기기로 결정했습니다. logging 프레임워크 선택 사용할만한 로깅 프레임워크 구현체는 log4j, logback, log4j2 였습니다. 헷갈릴만한 용어정리 sl4j(Simple Logging Facade For Java) 로깅 프레임워크가 아니라 logger의 인터페이스이다. slf4j를 이용하면 코드를 일정하게 유지하면서 구현체의 전환을 통해 다른 로깅 프레임워크로의 전환을 쉽고 간단하게 할 수 있습니다. log4j 가장 오래된 로깅 프레임워크입니다. 2015년 기준으로 개발이 중단되었습니다. logback log4j..
클라이언트에서 Location header를 찾지 못할 때
CORS 응답 설정시에 서버측에서 자주하는 실수가 있습니다. 아래 코드로 CORS 응답을 설정해줄 수 있습니다. 하지만 한가지 문제가 발생합니다. @Configuration public class WebConfig implements WebMvcConfigurer { public static final String ALLOWED_METHOD_NAMES = "GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,PATCH"; @Override public void addCorsMappings(final CorsRegistry registry) { registry.addMapping("/api/**") .allowedMethods(ALLOWED_METHOD_NAMES.split(",")));..
[Spring MVC] Dispatcher Servlet, 핸들러 매핑, 핸들러 어댑터
Spring MVC 구조를 학습하게 되었습니다. 스프링 MVC는 아래와 같은 흐름으로 진행됩니다. 처음엔 그림만 보면 이해하기 어렵다고 느낄텐데요. 차근차근 따라가면 흐름은 그렇게 어렵지 않습니다. Dispatcher Servlet 클라이언트로부터 HTTP 요청이 오면 먼저 Dispatcher Servlet에 도달하게 됩니다. (흐름 편의상 filter는 생략) 스프링 공식문서에서 Dispatcher Servlet은 아래와 같이 설명합니다. Spring MVC, as many other web frameworks, is designed around the front controller pattern where a central Servlet, the DispatcherServlet, provides a ..
우아한테크코스에서 찾은 나만의 공부법
우아한테크코스(이하 우테코)에 오기 전의 학습은 항상 인터넷 강의를 듣는 것으로 시작했다. 스스로 알아야 할 키워드를 찾지 못했고 누군가 알려주기를 바랐다. 듣고 있는 것이 편했다. 지금까지 항상 주입식으로 교육을 받아온 것이 익숙했기 때문이다. 우테코에 들어온 현재의 학습방법은 많이 달라졌다. 크루들과 여러 미션들을 겪으며 정립해간 학습 방법들을 소개한다. 미션 중심의 학습 키워드 레벨1 중반쯤 깨달았던 방법중 하나는 미션 중심으로 학습할 키워드를 찾는 것이었다. 무작정 교재를 따라 사서 처음부터 읽는 방식은 나랑 맞지 않았다. 우리에겐 우아한테크코스 커리큘럼이라는 프레임워크가 존재한다. 코치분들이 현재 단계에서 필수적으로 알아야 할 키워드를 미션을 통해 알 수 있도록 오랜 고민을 통해 만든 커리큘럼일..
[Spring] CORS 관련 405에러 해결방법
실제 EC2에 서버를 배포하고 프론트의 브라우저에서 요청했을때 CORS 헤더응답을 받지 못하여 405 에러가 발생합니다. 그런데, 프론트의 브라우저에서만 이 에러가 발생합니다. 포스트맨으로 요청했을 때는 모든 메서드가 정상적으로 작동합니다. 이번 포스팅은 배포시에 왜 이런문제가 발생하고 어떻게 해결해야할 지 알아봅니다. OPTIONS 메서드 요청 OPTIONS 메서드 OPTIONS 요청은 브라우저가 서버에게 지원하는 옵션들을 미리 요청하고 허가된 요청에 한해서 전송하기 위한 보안상의 목적이 있다. 네트워크 요청 시 실제 원하는 요청(GET, PUT, POST, DELETE) 전에 OPTIONS 요청을 보내는 경우가 존재합니다. 브라우저는 OPTIONS를 preflight하여 서버에서 허용하는 옵션을 미리..
[Kotlin] 내부 프로퍼티의 Setter만 막는 2가지 방법
외부에서 변경(setter)을 막기 위한 변수가 필요할 때가 있습니다. 그리고 코틀린에서는 생성자에서 val로 변수를 선언하면 자동으로 getter만 지원합니다. 하지만 생성자에 노출되지 않고 내부에서만 사용하는 프로퍼티에서 setter만 막고 getter만 지원하고 싶다면 어떻게 해야할까요? 이번 포스팅은 내부에서만 사용하는 프로퍼티에서 setter만 막고 getter만 지원하기 위한 2가지 방법을 소개하고 이 둘의 차이점을 설명합니다. private set data class Game(val words: Words, val date: LocalDate) { var count: Int = 0 private set ... count는 생성자로 직접 주입해주지 않고 내부에서만 사용되는 변수이지만, gett..