목록기초튼튼 (110)
IT 개발노트
코딩 컨벤션이란? 코딩 컨벤션이란 가독성이 좋고 관리하기 쉬운 코드를 작성하기 위한 코딩 스타일 규약을 말한다. 코딩 컨벤션을 준수하면 가독성이 좋아지고 성능에 영향을 주거나 오류를 발생시키는 잠재적인 위험 요소를 줄여줘 유지보수 비용을 줄일 수 있다. 코딩 컨벤션을 적용하기 위해 정적 코드 분석 도구를 도입하는데, 보통 자바스크립트에서는 ESLint, Java에서는 Checkstyle과 같은 도구를 주로 사용한다. Java에서는 구글이나, 네이버에서 지정한 코딩 컨벤션이 유명하므로 오늘은 InteliJ에 네이버 코딩 컨벤션을 Code Style Formatter로 설정하고, Checkstyle까지 적용하는 과정을 설명한다. 네이버 캠퍼스 핵데이 Java 코딩 컨벤션에 대해 자세한 명세 사항은 아래 링크..
Stateful (상태유지) 상태 유지라 함은 클라이언트와 서버 관계에서 서버가 클라이언트의 상태를 보존함을 의미한다. 클라이언트와 서버 간에 송수신을 하며 단계별 과정을 진행하는데 있어, 서버에서 클라이언트가 이전 단계에서 제공한 값을 저장하고 다음 단계에서도 저장한 상태이다. 대표적으로 홈페이지에서 한번 로그인을 하면 페이지를 이동해도 로그인이 풀리지않고 계속 유지되는 것이 바로 서버가 클라이언트의 상태를 유지(기억)하고 있으니까 가능한 것이다. 클라이언트의 정보를 기억한다라는 말은 어딘가에 정보를 저장하고 통신할때마다 읽는다는 뜻이다. 이러한 정보들은 일반적으로 브라우저의 쿠키(Cookie)에 저장되거나, 서버의 세션(Session) 메모리에 저장되어 상태를 유지하게 된다. Stateful한 프로토..
객체를 캡슐화 하는 것은 권장 습관이므로 setter를 사용한다고 보면 된다. 근데 만약 deserialize 한 후에 해당 객체가 immutable 하기를 원한다면? setter가 없어야 한다. 이때 기본 생성자 + setter 조합을 대신해 객체를 생성할 수 있도록 해주는 것이 @JsonCreator 어노테이션이다. 이 어노테이션을 생성자나 팩토리 메소드 위에 붙이면 jackson이 해당 함수를 통해 객체를 생성하고 필드를 생성과 동시에 채운다. 이렇게 생성자나 팩토리 메소드를 통해 필드 주입까지 끝내버리면 setter 함수가 필요 없게 된다. jackson을 통해 deserialze한 immutable한 객체를 얻을 수 있는 것이다. 그래서 @JsonCreator를 쓰는 것 같다. 생성자를 포함한..
마이크로 서비스를 개발하면, 각각의 용도로 여러 컨테이너가 필요하며, 그 개수는 상황에 따라 빠르게 늘어날 수 있다. 컨테이너 개수가 늘어나면서 리소스 등 관리 포인트가 늘어나는데 이것을 자동화해주는 것이 컨테이너 오케스트레이션 툴이라고 한다. 툴 중엔 가장 유명한 쿠버네티스(k8s)가 있고, Docker Swarm, Nomad, Mesos 등이 있으며 AWS에는 ECS (Elastic Container Service)라는 서비스가 있다. ECR (Elastic Container Registry) ECR은 컨테이너를 위한 프라이빗 도커 레포지토리이며, ECR를 사용하면 AWS 컨테이너 서비스와 호환성 측면에서 이점이 있다. 클러스터를 ECR과 쉽게 연결할 수 있으며, 새로운 버전의 이미지가 올라오면 자동..
문제 PIL 라이브러리를 통해 이미지를 load하거나 save할 때 에러가 났다. 아래 코드는 convert지만, convert method도 들어가보면 제일 첫 줄에서 self.load()를 하고 있었다. from PIL import Image image = Image.open(buffer) image = image.convert('RGB') # OSError: image file is truncated (n bytes not processed). PIL 소스 코드를 들어가보면 다음과 같은 상황에서 에러를 내는 것을 알 수 있다. png/gif 또는 jpeg/jpg 파일을 읽다가 에러가 났을 때, LOAD_TRUNCATED_IMAGES의 True, False 여부에 따라 에러를 raise하도록 되어있다..
패키지 구성은 크게 레이어 계층형, 도메인형 이렇게 2가지 유형이 있다고 생각한다. 각 유형별로 간단하게 설명하고 개인적인 Best Practices를 작성한다. 계층형 ── src ├── main │ ├── java │ │ └── com │ │ └── example │ │ └── demo │ │ ├── DemoApplication.java │ │ ├── config │ │ ├── controller │ │ ├── dao │ │ ├── domain │ │ ├── exception │ │ └── service │ └── resources │ └── application.properties 계층형 구조는 각 계층을 대표하는 디렉터리를 기준으로 코드들이 구성된다. 계층형 구조의 장점은 해당 프로젝트에 이해가 ..
1. 복수 형태를 사용하자 GET: /users POST: /users PUT: /users/12 DELETE: /users/12 DB의 유저 Table을 생각하면 보다 쉽게 이해가 된다. 유저 array를 받아오는 요청은 여러 유저 정보를 받아오는 것이니 users가 자연스럽다. (GET: /users) 유저를 생성하는 것도 유저 array에 하나의 유저를 추가하는 것이기 /users에 요청을 보낸다고 이해하면 된다. (POST: /users) 특정 id의 유저를 받아오는 것도 유저 array 중에서 고르는 것이기에 /users/:id가 꽤나 자연스럽다. 몇몇 글을 살펴보면 복수를 선호하지만 단수를 쓰는 것도 큰 상관은 없다는 의견들이 많아. 하지만 모두 공통적으로 혼합해서 사용하는 것은 지양한다. 2..