[Effective Java] 10장. 예외
·
Java/Effective Java
[item-69] 예외는 진짜 예외 상황에만 사용하라예외는 반드시 예외 상황에서만 사용하며 일상적인 제어 흐름용으로 사용해서는 안됩니다.잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없어야 합니다.이를 위해서 상태 검사 메서드를 제공하거나 옵셔널 또는 특정 값을 반환하도록 하면 됩니다.try-catch 블록 안에 들어가면 JVM이 적용할 수 있는 최적화 범위가 제한됩니다.잘못된 예외 사용 예시try { int i = 0; while(true) range[i++].climb();} catch (ArrayIndexOutOfBoundsException e) {}표준적인 관용구 // 표준적인 관용구로 작성한 예for (Mountain m : range) m...
[Effective Java] 9장. 일반적인 프로그래밍 원칙
·
Java/Effective Java
[item-57] 지역변수의 범위를 최소화하라지역변수는 사용할 때 선언하고 초기화해야 합니다.옛날 방식의 습관으로는 코드 블록이 첫 부분에 변수를 선언하는 경우가 많았습니다.자바의 경우는 어디에서 선언해도 되기에, 처음 사용할 때 선언하면 지역변수의 범위를 줄일 수 있습니다.지역변수를 초기화할 수 없다면, 초기화할 수 있을 때 선언하면 됩니다. (예외 : try-catch)규칙반복문은 while보다 for문을 권장: while문을 사용하면 반복문 밖으로 불필요한 변수가 선언됩니다.for문을 사용하면 반복 변수 (loop variable)의 범위가 반복문 내부로 제한됩니다.ExampleIterator i = c.iterator(); // 불필요하다.while (i.hasNext()) { doSomet..
[Design Pattern] Chain of Responsibility Pattern(책임 연쇄 패턴)
·
Java/Design Pattern
개요오늘은 책임 연쇄 패턴에 대해서 상세히 정리해보려고 합니다. 최근 기업 기술과제를 수행하면서, HTTP Request 시에 보안 규칙 검사를 확장성을 고려하여 책임 연쇄 패턴을 적용하였습니다. 해당 디자인 패턴을 적용하게 된 배경을 설명드리기 전, 개념과 예시를 Spring Security에서 사용되는 Servlet Filter로 들어서 사용 방법을 알아보도록 하겠습니다. Chain of Responsibility (책임 연쇄 패턴)핸들러들의 체인​(사슬)​을 따라 요청을 전달할 수 있게 해주는 행동 디자인 패턴각 핸들러는 요청을 받으면 요청을 처리할지 아니면 체인의 다음 핸들러로 전달할지를 결정합니다.Spring Security Framework의 Servlet Filter도 책임 연쇄 패턴이 적..
[Java] Collection.foreach(), Stream.foreach()를 비교해보자
·
Java/Java Concept
Foreach컬렉션이나 배열의 모든 원소를 처음부터 끝까지 차례대로 탐색하면서, 각 요소에 대해 동일한 작업을 수행하는 반복문Java8에서 추가된 Iterable 인터페이스의 기본 메서드인 forEach() 메서드를 제공하며, 해당 메서드를 통해 컬렉션을 반복하며 각 항목에 대해 반복 작업을 수행할 수 있습니다.각 요소 간 수정/삭제 작업이 필요하다면, forEach 대신 iterator()를 활용할 필요가 있습니다.향상된 for문 (enhanced for loop)이라고도 부릅니다.Collection.foreach(), Stream.foreach()대부분의 경우에는 같은 결과를 낳지만, 특정 부분에서의 차이가 존재합니다.Collection의 forEach()의 경우에는 forEach() 메서드를 제공하..
[Java] final, interface, abstract class
·
Java
Final Keyword필드, 메서드, 클래스 앞에 위치할 수 있습니다.변경이나 확장이 불가능한 성질을 가지게 됩니다.위치의미클래스변경 또는 확장이 불가능한 클래스, 상속 불가메서드오버라이딩 불가한 메서드변수값 변경이 불가능한 상수 final class Final { // 확장/상속 불가능 final int x = 1; // 변경할 수 없는 상수 final void getConstant() { // 오버라이딩 불가한 메서드 final int CONSTANT = x; // 상수 return x; }} Interface클래스가 구현해야 하는 동작을 선언하는 데 사용되는 추상 유형 (wikipedia)interface 키워드를 사용하여 정의하며, 오직 추상 메서드와 상수(sta..
[Java] Stream, Collection
·
Java
개요Java에서는 방대한 데이터를 효율적으로 다루기 위해 Collection과 Stream이라는 강력한 도구를 제공합니다. Collection은 데이터를 저장하고 관리하기 위한 자료구조의 집합이며, Stream은 이러한 데이터를 보다 선언적이고 간결하게 처리할 수 있도록 돕는 API입니다. 이 두 가지를 이해하면 반복문과 조건문에 의존하던 기존 방식에서 벗어나, 가독성과 유지보수성이 높은 코드를 작성할 수 있게 됩니다. 이해를 돕기 위해 Stream, Collection 관련 예제 코드를 작성해 보았는데, 첨부된 링크를 통해 확인하실 수 있습니다.https://github.com/daily1313/java-stream-collection GitHub - daily1313/java-stream-colle..
[Effective Java] 8장. 메소드
·
Java/Effective Java
[item-49] 매개변수가 유효한지 검사하라유효성 검사: 메서드, 생성자가 예상하는 입력 조건을 만족하는지 검증하는 과정매개변수의 유효성 검사는 메서드 몸체가 시작되기 전에 해야 하며 매개변수에 대한 제약사항은 문서화가 필요합니다.유효성 검사가 제대로 되지 않는다면, 중간에 모호한 오류가 발생할 수 있으며 행여나 수행되더라도 잘못된 결과가 반환될 수 있습니다.그래서 매개변수는 메서드 코드 시작 부분에서 검증하는 것이 좋습니다.방법@Nullable: 표준 XrequireNonNull (Java 7), checkFromIndexSize, checkFromToIndex, checkIndex (array 전용, Java 9) ExampleBigInteger mod methodpublic BigInteger m..
[Effective Java] 7장. 람다와 스트림
·
Java/Effective Java
[item-42] 익명 클래스보다는 람다를 사용하라 함수 객체자바에서 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스를 사용했습니다. 이러한 인터페이스의 인스턴스를 함수 객체라고 하여 특정 함수나 동작을 나타내는 데 사용합니다.익명 클래스 (Anonymous Class)이름이 없는 클래스로, 단일 인스턴스를 생성하고 간단한 작업에 사용하기 위한 클래스[구문]인터페이스명 변수명 = new 인터페이스명() { // 인터페이스 메서드 구현 (메서드 오버라이드) // 추가적인 멤버 변수 또는 메서드도 선언 가능};JDK 1.1부터 함수 객체를 만들때 주로 사용합니다.코드가 너무 길기에 함수형 프로그래밍(Functional Programming)에 적합하지 않습니다. 익명 클래스 사용 Ex..
[Spring] csv 파일의 데이터 파싱 및 저장 성능 개선기 (JPA save() vs JdbcTemplate batchUpdate() vs MariaDB LOAD DATA INFILE)
·
Java/Spring
운영 중인 사내 시스템에서 IEEE OUI 파일(https://standards-oui.ieee.org/oui/oui.txt)을 다운로드하여 MAC 주소와 제조사 정보를 추출하고, 이를 DB에 저장해야 하는 요구사항이 있었습니다. 기존 처리 흐름 (AS-IS)oui.txt file -> oui.csv 파일 형식으로 파싱합니다.csv 파일을 BufferedReader로 읽어서 JPA save() 반복 호출로 저장합니다. 즉, 애플리케이션 런타임 시점에 csv 파일을 oui, vendor 정보로 파싱하여 일일이 save() 메서드를 호출하는 방식이었습니다. 하지만, 해당 방식은 매우 성능이 낮으며 이에 대한 첫 번째 대안으로는 saveAll() 메서드를 활용할 수 있습니다. 먼저, JPA에서 제공하는 sa..
[Effective Java] 6장. 열거 타입과 애너테이션
·
Java/Effective Java
[item-34] int 상수 대신 열거 타입을 사용하라enum type 나오기 전에는 정수 열거 패턴(int enum pattern)을 사용해 왔습니다.public static final int APPLE_FUJI = 0;public static final int APPLE_PIPPIN = 1;public static final int ORANGE_NEVEL = 0;public static final int ORANGE_TEMPLE = 1; 위와 같은 정수 열거 패턴은 타입 안정성을 보장하기 어렵습니다.위의 대안으로 나온 것이 열거 타입입니다. 열거 타입public enum Apple { FUJI, PIPPIN, GRANNY_SMITH}public enum Orange { NAVEL, TEM..