-
java 병렬로 연산하기 ExecutorService API 쓰레드풀에 일정 개수의 쓰레드를 만들어두고 처리하는 방식의 API : limit 개수만큼 동시에 처리함 ExecutorService executor = Executors.newFixedThreadPool(5); List<Future<String>> results = new ArrayList<>(); for (int i = 0; i < 30; i++) { results.add(executor.submit() -> { Thread.sleep(5000); return Thread.getCurrrentName() + ", end time : " + LocalDateTime.now(); }); } for (Future<String> result : results) { System.out.println(result.get()); } executor.shutdown(); Stream API(java8) 하나의 task를 여러개 task로 쪼개고, 처리한 후 하나로 합치는 형태로 처리...
-
오늘의 회고 드디어 시스템 파악하기 시작! 모르는 것은 모른다고 말하고 배우는 자세를 취하면 아무리 실력 없더라도 안좋게 보지는 않을까 생각함. 그리고 입사해서 느낀 것은 글로 정리하는건 역시나 중요하다는 것 사내 위키에 시스템에 대한 히스토리 정리, 설명이 잘 되어 있다보니 파악하기가 수월하였음 명패에 쓴 “기본으로 돌아가자” 문구처럼 모르겠으면 거기서 헤매기보다 처음부터 훑어보면서 어디를 모르는지 체크부터 하도록 해야겠다. 오늘 공부 못한만큼 내일 많이 해야지~~~ 데이터베이스 upsert 데이터베이스에 저장되어있는 데이터가 있을 경우(unique key값 기준) update, 없을 경우 insert...
-
git git flow(+operation) fork flow : master, develop, feature, release, hotfix 브랜치로 구성하고, 저장소는 upstream, origin, local으로 구성함 브랜치 : master가 현재 운영, develop은 기능 개발 시 출발점이 되는 브랜치, feature는 각 기능 개발 때 사용되는 브랜치(develop에서 branch 생성), release는 다음 release될 브랜치, hotfix는 긴급하게 수정해야하는 상황이 발생했을 때 master로부터 브랜치를 따서 수정 후 merge 배포를 진행함(절대적인 것은 아님! - 각 팀의 운영 노하우에 따라 조금씩 수정될 수 있음) 저장소 : upstream을 prod로 사용하고 origin은...
-
데이터베이스 트랜잭션 격리 수준(Lock 정책) 멀티쓰레드 환경에서 트랜잭션이 지켜야하는 트랜잭션 간의 간섭 금지(Isolation)와 속도 트레이드오프 발생 : 격리 수준 특징을 알아야 도메인 특징에 따라 알맞는 격리 수준을 골라 트레이드오프 상황을 벗어날 수 있을 것이라 생각됨 데이터베이스마다 다르기 때문에 어떤 격리 수준이 있는지는 알아봐야함 명칭 설명 발생할 수 있는 문제점 read uncommited 커밋되지 않은 데이터 변경까지도 다른 트랜잭션에서 읽기 가능 phantom read, non-repeatable read, dirty read read commited 커밋된 데이터 변경을 읽을 수 있음 phantom read,...
-
절차지향 vs 객체지향 프로그래밍 입사 첫날 운 좋게도 객체지향의 사실과 오해 저자이자 배민찬 개발자이신 조영호님의 특강을 들을 수 있었다. 절차지향과 객체지향적인 설계와 코드를 비교해가며 각각의 특징과 장단점에 대해 들을 수 있는 시간이었다. 절차지향 데이터를 관리하는 클래스와 로직을 처리하는 클래스가 분리되어 있음 : 객체는 단지 데이터를 getter/setter 하는 용도로 밖에 사용되지않음 중앙 집중형 코드가 완성됨 : 역할에 따라 로직을 처리하지않고, 데이터를 가진 객체들이 한 곳에서 모여서 절차지향적으로 처리되다보니 변경사항이 생겼을 때 유연하지못함 객체지향 데이터(상태값)와 로직 처리를...