전체 글
-
22. 스태틱 vs 싱글톤 (Static vs Singleton)스프링개발자/201 - 일반 2020. 10. 29. 10:43
오늘 회사에서 코드리뷰를 받다가, 해당 클래스가 Spring Component(Singleton)인데, 왜 그 안에 static method를 썼냐고 질문을 받았다. 스태틱과 싱글톤에대해 생각해본 적이 거의 없어서, 알아보았는데, 정리된 내용을 여기에 적는다. 먼저, 스태틱과 싱글톤은 비교는 apple to apple의 올바른 비교의 대상이다. 스태틱 클래스는 스태틱 메소드만을 구현 할 수 있다. 인스턴스를 만들 수 없고, 생성자도 갖지 않으며, 거의 Utility 성 함수의 모음 같은 역할이다. 성능도 스태틱이 빠르다. 싱글톤에서는 OOP의 장점을 살려서 interface, override, lazy loading 등등 프로그램적으로 활용할 수 있는 여지가 많다. 결론적으로 @Component 에서는 ..
-
21. MongoDB를 꼭 써야해?스프링개발자/201 - 일반 2020. 10. 19. 02:34
1. 개요 우리 팀은 vehicle route optimization을 제공하는 팀이다. 고객마다 중요하게 생각하는 parameter들이 다르기 때문에 이 값들을 db에 configuration, objective 등의 형태로 SQL을 통해 저장한다. 최근 NoSQL(MongoDB)를 사용하기 시작했는데, schema에 딱히 얽매이지 않고 데이터 구조가 나중에 바뀌더라도, 코드의 큰 변화 없이 그냥 저장하면 되기 때문에, 고객 metrics를 저장하기 위해 사용하고 있다. 이와중에, 고객이 보낸 입력 데이터와 우리의 결과(return) 값들을 저장하는 logging framework를 우리가 직접 몽고로 만들기로 했다. (Splunk가 고객 입력데이터중 몇몇 필드를 masking 하는 문제가 있어서이다)..
-
20. @Scheduled 어노테이션스프링개발자/201 - 일반 2020. 10. 17. 04:40
1. 개요 Cron Job처럼, 주기적으로 실행해야되는 action들을, 스프링 레벨에서 구현 할 수 있다. (본 예제는 기존에 진행하던 코드를 포함하고있습니다) 2. 스프링 설정 @EnableScheduling 어노테이션을 Configuration 레벨에 추가한다. package com.example.monorepo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.scheduli..
-
6. 그레이들 멀티프로젝트 - 데이터베이스 셋업 및 활용(2) - Functional Interface, dynamic bean selector스프링개발자/301 - 아키텍처 2020. 10. 7. 05:51
[배경] 세 가지 탈것의 종류가 있다; 자동차, 트럭, 자전거 각각의 고객은 이 세가지의 탈 것 중에 하나를 고를 수 있다. 자동차를 고른 고객은 car instance가 생성되어 프로그램에 사용되게 되고 트럭을 고른 고객은 truck instance가 생성되어 프로그램이 진행된다. 각각의 탈 것 instance에 따라서 속도, 무게, 부피 등등을 다르게 할 수 있다. 이렇게 하면, code base change없이 데이터베이스 값 변경만으로 dynamic한 request call이 가능하다. 1. 모델 클래스 준비 2. 탈것들의 Bean Config 만들기 3. 프로그램 시작시에 설정 불러오기 4. 테스트 1. 모델 클래스 준비 자동차, 트럭, 자전거의 세 가지 탈것 모두 공통점이 있으니 탈 것이라는 ..
-
고객의 문제를 해결해 줄 수 없을 때그냥 2020. 10. 7. 01:56
우리팀의 API를 호출하고 결과를 분석하는 포드 내부 팀이 있다. 그 곳에 lead software가 어떤 issue를 가지고 팀 간의 slack channel에 글을 올렸다. 문제를 봤는데, 분명 우리 쪽의 오류가 보인다. 코드에서 Root cause를 찾아내서 해결해주면 가장 좋겠지만, 어떤 것도 할 수 없는 상황이었다. 1) 문제를 재현 할 수 없었다. 고객과 동일한 조건(Request, Configuration) 을 가지고 시도했는데 고객이 겪은 문제를 우리는 보이지 않았다. 2) 여러 문제가 한꺼번에 있었다 - 어떤 환경에서만 발생하는 Syntax 문제가 있었고 - 500 exception을 던져야 하는 상황임에도 문제 없이 넘어갔고 - (다시)문제를 재현 할 수 없었다 Uncertainty가 ..
-
5. 그레이들 멀티프로젝트 - 데이터베이스 셋업 및 활용(1) - Entity, CollectionTable, 데이터베이스값 불러오기스프링개발자/301 - 아키텍처 2020. 10. 5. 12:20
[배경] 도커로 데이터베이스를 구동한 후, 데이터 값을 불러와서 어플리케이션에서 사용해보자. 숫자, 문자 값을 불러와서 활용 할 수 있다. 이외에도, 데이터 값에따라 runtime의 특정 bean의 타입이 달라지는 configurable bean또한 만들어보자. 1. 도커 셋업 및 인텔리제이 연동 이전 글을 참고하자. docker images docker ps docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password --name mysql_latest mysql docker ps 다운받은 도커 이미지를 확인하고, 현재 구동중인 container가 있는지 확인한다. 다운 받은 이미지중의 하나(IMAGE ID)를 선택해서 이미지를 실행시킨다. 실행되었는지 확인..
-
19. 자바 인터페이스 with code body스프링개발자/201 - 일반 2020. 10. 2. 04:41
자바8부터 인터페이스에도 코드를 쓸 수 있다. default 혹은 static 메소드에 한해서. 인터페이스 변수(variable)를 갖는 것도 가능하다 1. 코드를 품은 인터페이스 public interface Objective { int offset = 2; // 변수도 선언 및 초기화 가능 default int solve(int a, int b) { return offset + a + b; // 코드를 품은 녀석 } int guess(int a, int b); // 원래 쓰는 방식 } 2. 인터페이스 구현체s public class MulObjective implements Objective { @Override public int solve(int a, int b) { return offset + ..
-
18. Git 브랜치 프로텍션(Branch Protection Rule)스프링개발자/201 - 일반 2020. 9. 7. 12:41
다음의 상황을 막을 수 있다. 1) Master branch에 직접 push 2) 내가 PR을 만들고 approve 3) 아무도 PR을 approve하지 않았는데 merge 하기 4) build failure가 branch를 merge 하기 5) PR을 approval 받고 난뒤에 추가로 commit해서 merge하기 1. git repo 관리자 권한(admin) Settings 메뉴가 보여야 한다. Settings -> Branches 2. 설정 위의 그림과 같은 설정을 많이 쓴다. 마스터 브랜치에 적용한다 1번항목은 PR을 merge하기 위한 최소 approve 갯수 2번은 approve이후에 new commit이 있으면 기존 approve가 취소된다(팀의 상황마다 유동성 있게 하자) 3번은 지정된 ..