728x90

개발/Java & Kotlin 134

[JPA] N+1 해결하기

N+1은 한 번의 쿼리를 요청했는데 여러 번 쿼리가 요청되는 현상을 말한다.(1+N) Book 도메인에 아래와 같이 연관관계가 있었고, (각각 양방향 연관관계) @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "book_id") private Long id; private String bookNm; // 도서명 ... @OneToMany(mappedBy = "book", fetch = FetchType.LAZY, cascade = CascadeType.ALL , orphanRemoval = true) private List archiveList = new ArrayList(); @OneToMany(mappedBy = "book..

[Java] Raw 타입은 사용하지 말기

1. 개념 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 이는 제네릭 클래스나 제네릭 인터페이스라 함. List 를 말하며, 제네릭 클래스와 제네릭 인터페이스를 제네릭 타입이라고 함. 제네릭 타입은 매개변수화 타입을 정의함. 제네릭을 지원하기 전에는 컬렉션을 직접 선언함 2. 잘못된 코드 private final Collection stamps = ...; 위 코드를 사용하면 다른 타입을 넣어도 오류가 없음. stamps.add(new Coin(...)); coin을 꺼내기 전에는 오류를 뱉지 않음. 3. 올바른 코드 private final Collectiom stamps = '...'; stamps에 Coin 타입을 넣을 경우 incompatible types: Coin cannot be con..

[Java] 클래스와 멤버는 접근 권한 최소화하기

1. 개념 - 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 클래스의 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼는지. - 잘 설계된 컴포넌트는 구현과 API를 깔끔히 분리. - API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않음. -> 이는 정보 은닉, 캡슐화 2. 정보 은닉의 장점 시스템 개발 속도를 높임. -> 여러 컴포넌트를 병렬로 개발할 수 있기 때문. 시스템 관리 비용을 낮춤. -> 각 컴포넌트를 더 빨리 파악하여 디버깅 가능하고, 다른 컴포넌트로 교체하는 부담도 적음. 성능 최적화에 도움을 줌. 재사용성을 높여줌. 큰 시스템 제작의 난이도를 낮춰줌. -> 시스템 전체가 완성되지 않은 상태에서도 개별 컴포넌트의 테스트..

[Java] File 입출력

1. 개념 - 파일은 가장 많이 사용되는 입출력 대상 - File 클래스를 통해 파일과 디렉토리를 다룰 수 있음. - window에서 예시 코드 import java.io.*; class FileExample { public static void main(String[] args) throws IOException { File f = new File("경로"); String fileName = f.getName(); int pos = fileName.lastIndexOf("."); System.out.println("경로 제외한 이름 " + f.getName()); System.out.println("확장자 제외한 이름 " + fileName.substring(0, pos)); System.out.pri..

[Java] try-with-resources 사용하기

자바에는 close() 메소드를 사용해 직접 닫아야 하는 자원이 많음. ex) - InputStream - OutputStream - java.sql.Connection ... 이를 방지하기 위해 try-finally가 많이 쓰였다. static String firstLineOfFile(String path) throws IOExceiption { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } } 사용해야할 자원이 많아지면 static void copy(String src, String dst) throws IOException { InputSt..

[Java] private 생성자로 인스턴스화 막기, 의존 객체 주입 사용하기

1. 인스턴스화 막기 - 단순히 정적 메소드와 정적 필드만을 담은 클래스를 만들 때가 있음 *예시 java.lang.Math java.util.Arrays java.util.Collections final 클래스와 관련된 메소드들을 모을 때. - 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아님. - 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만듦. -> 매개변수가 없는 public 생성자가 만들어짐. -> 사용자는 생성자가 자동 생성된 것인지 아닌지 구분할 수 없음. - 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없음. -> 하위 클래스를 만들어 인스턴스화하면 됨. - 이를 막기 위해서는 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수..

[Java] private 생성자나 열거 타입으로 싱글턴 보증하기

- 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말함. - 싱글턴의 예로는 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트. - 클래스를 싱글턴으로 만들면 테스트가 어려워 질 수 있음. -> 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 Mock 구현으로 대체할 수 없기 때문. - 싱글턴을 만드는 방식은 2가지. - 두 방식 모두 생성자는 privated으로 생성 - 유일한 인스턴스에 접근할 수 있는 수단으로 public staitic 멤버를 생성해둔다. 1. public static 멤버가 final 필드인 방식 public class Member { public static final Member INSTANCE = new Memb..

[Java] 생성자 대신 빌더 사용하기

1. 점층적 생성자 패턴 - 정적 팩토리와 생성자는 매개변수가 많을 경우 적절히 대응하기 어렵다. - 과거에는 점층적 생성자 패턴 사용 public class Member { private String name; private String email; private int age; private String address; private String phone; public Member (String name, String email) { this(name, email); } public Member (String name, String email, int age) { this(name, email, age); } public Member (String name, String email, int age,..

[Java] 생성자 대신 정적 팩토리 메소드 사용하기

- 예시 코드 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } - 장점 1. 이름을 가질 수 있다. 생성자와 매개변수만으로는 리턴될 객체의 특성을 제대로 설명하기 어렵다. 예를들면 // 생성자 public class Person { public Person() {} } // 정적 팩토리 메소드 public class Person { private static Person PERSON = new Person(); private Person() {} public static final Person getInstance() { return PERSON; } } 정적 팩토리 메소드는 Person 클래스의 인..

[Spring] 스프링 배치(Spring Batch) 가이드 따라가기 (7)

스프링 배치 가이드 - 지난 포스팅에서 튜토리얼 보고 따라해봤는데, 이번에는 개념부터 천천히 공부해보자. - 책을 보고 공부하려 했으나, 스프링과 부트의 배치 사용 문법이 많이 달라 이동욱님의 블로그를 보고 공부했다. https://devhooney.tistory.com/140 [Spring] 스프링 배치(Spring Batch) 가이드 따라가기 (5) 스프링 배치 가이드 - 지난 포스팅에서 튜토리얼 보고 따라해봤는데, 이번에는 개념부터 천천히 공부해보자. - 책을 보고 공부하려 했으나, 스프링과 부트의 배치 사용 문법이 많이 달라 이동욱 devhooney.tistory.com 1. ItemProcessor - ItemProcessor는 Reader에서 넘겨준 데이터를 개별 건으로 가공하고 처리한다. -..

728x90