본문 바로가기

분류 전체보기

(32)
확장-축소 패턴 이번에 회사에서 기존 수작업으로 처리해야하는 작업들을 자동화하여 모든 회사에 새로운 데이터베이스 구조도로 동시에 변경될 수 있는 기능이 필요하다하여 분석 중 pgRoll(https://github.com/xataio/pgroll)이라는 비교적 최근에 나온 오픈소스를 분석하며 확장 축소 패턴에 대해서 분석해보았다. 아무래도 마이그레이션은 앞으로도 마주치기 싫으나 마주칠 수 밖에 없는 상황들이 계속 발생하기에 해당 패턴을 알면 도움이 될까 싶어 찾아보았고 공부해보았는데, 아무래도 한글로 되어있는 곳을 찾기가 쉽지않아 하기 링크를 참조하여 공부할 겸 번역하였다. (https://www.prisma.io/dataguide/types/relational/expand-and-contract-pattern) 확장 축..
알고리즘 - Two Sum 1. Brute Force 알고리즘 브루트 포스 접근법은 간단하다. 루프 안에서 각 원소값인 𝓍 와 target - 𝓍 와 일치하는 다른 값을 찾으면 된다. class Solution { public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[j] == target - nums[i]) { return new int[] { i, j }; } } } return null; } } 시간 복잡도 분석 - 시간 복잡도 : O(n2) 값을 찾기 위해 돌리는 루프와 그 안에서 남은 원소의 값을 돌리는 루프가 있기에 시간복잡도는..
1. 도메인 모델 시작하기 도메인 모델 패턴 애플리케이션 아키텍처는 아래와 같이 4개의 영역으로 구성된다. 도메인 모델은 아키텍처 상의 도메인 계층을 객체 지향 기법으로 구현하는 패턴을 말한다. 영역 설명 Presentation 사용자의 요청을 처리하고 사용자에게 정보를 보여준다. Application 사용자가 요청한 기능 실행(업무 로직을 직접 구현하지 않으며 도메인 계층을 조합해서 기능을 구성) Domain 시스템이 제공할 도메인 규칙 구현 Infrastructure DB나 메시징 시스템과 같은 외부 시스템과의 연동 처리 도메인 계층에만 핵심 규칙을 구현한 코드가 위치하기에 규칙이 바뀌거나 규칙을 확장할 때 다른 코드에 영향을 덜 주고 변경 내역을 모델에 반영할 수 있다. Entity 와 Value Entity 엔티티의 가장 ..
[독후감] 자바 성능 튜닝 이야기 '자바 성능 튜닝 이야기' - 이상민님 실제 웹 서비스에서 사용될만한 자바 성능과 관련된 이야기를 담은 책이다. 책의 도입부만 읽었을 때 아래와 같은 내용들이 나와 초급자용 코딩 관련 튜닝 책이라고 생각했다. - String / StringBuilder / StringBuffer의 차이 - List, Set, Map 등의 자료구조 - for, forEach 등의 차이 물론 심오하게 파면 어려울 수 있겠으나, 업무를 진행하며 인터넷이나 자바 기초 서적과 같은 곳에서 볼법한 이야기를 담았기 때문이다. 그러나 기존에 단순하게 Java로 개발하여 웹서버에 올리기만 한 나에게 있어 책의 중반부를 넘어서며, 웹서버 관련 이야기가 나오면서부터 튜닝 관련 난이도가 높아지기 시작했다. 웹서버에서 성능을 높이기 위해 필요..
자바 성능 튜닝 이야기 1. 메서드 수행 2. 메서드가 운영체제의 커널에 파일을 읽으라고 요청함 3. 커널이 파일을 읽어 자신의 커널에 있는 버퍼에 복사(DMA에서 수행) 4. JVM으로 해당 데이터 전달 5. JVM에서 스트림 관리 클래스로 데이터를 처리 NIO에서 새로 추가된 개념 1. 버퍼 2. 채널 3. 문자열의 엔코더/디코더 제공 4. Perl 스타일의 정규 표현식에 기초한 패턴 매칭 방법 제공 5. 파일을 잠그거나 메모리 매핑이 가능한 파일 인터페이스 제공 6. 서버를 위한 복합적인 Non-blocking IO 제공 Java 7 부터 NIO2 가 도입됨 로그 1. System.out.println 사용금지 2. 직접 로그툴을 만들어 사용하는 것 금지 3. Logger 사용 4. Exception 처리를 위한 부분을 ..
10. equals는 규칙에 맞게 재정의하라 equals 메서드는 재정의하기 쉬워 보이지만 사실 문제가 많다. 문제를 회피하는 가장 쉬운 길은 아예 재정의하지 않는 것이다. 클래스에 equals를 정의하지 않는다면 그 클래스의 인스턴스는 오직 자기 자신과만 같게된다. 그러니 다음에서 열거한 상황 중 하나에 해당한다면 재정의하지 않는 것이 최선이다. 각 인스턴스가 본질적으로 고유해야 한다. 인스턴스의 동등성을 검사할 필요가 없다. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. 클래스가 private이거나 package-private이고, equals를 호출할 일이 없다. 만약 equals메서드에 대한 실수를 좀 더 철저히 막고 싶다면 @Override public boolean equals(Object o) { throw n..
9. try-finally 보다는 try-with-resources를 사용하라 자바 라이브러리에는 close메서드를 활용해 직접 닫아줘야 하는 자원이 많다. 이런 경우 자바에서는 전통적으로 try-finally가 사용되었다. 하지만 try-finally는 닫아줘야하는 자원이 2개만 되어도 굉장히 난잡해진다. static void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputStream(dst); try { byte[] buf = new byte[BUFFER_SIZE]; int n; while((n = in.read(buf)) >= 0) out.write(buf, 0, n); } finally ..
8. finalizer와 cleaner 사용을 피하라