본문 바로가기
728x90

java112

[Java] Null 대신 빈 컬렉션이나 배열을 리턴할 것 컬렉션이 비어 있을 경우 null을 리턴하기도 한다. 그 예시로 private final List exampleList = ...; public List getExample() { return exampleList.isEmpty() ? null : new ArrayList(exampleList); } 이렇게 사용을 하기도 하는데, 이렇게 할 경우 리턴 받는 쪽에서 null을 처리하는 코드를 추가로 작성해야 한다. 혹시나 null 처리 코드가 없을 경우 에러가 발생할 확률이 높다. 이를 방지하기 위해서는 public List getExample() { return new ArrayList(exampleList); } 이렇게만 해주면 null처리 코드가 없어도 에러가 발생할 확률을 낮출 수 있다. 하지만 이.. 2023. 6. 28.
[Java] Stream 사용 시 주의 사항 스트림은 자바 8부터 도입된 기능으로, 데이터 처리를 간결하고 효율적으로 할 수 있도록 지원한다. 이를 적절히 활용하면 데이터 처리 작업을 더욱 쉽고 효율적으로 수행할 수 있다. 스트림은 연속된 데이터 처리, 지연 평가(Lazy evaluation), 파이프라인 처리, 병렬 처리, 스트림 연산, 외부 반복 숨김 등의 특징이 있다. 하지만 주의해서 사용해야 한다. 이유 리소스 누수: 스트림은 외부 리소스(파일, 네트워크 연결 등)와 관련될 수 있다. 스트림을 제대로 닫지 않으면 리소스 누수가 발생할 수 있다. 따라서, 스트림 사용 후에는 반드시 명시적으로 닫아야 한다. 예외 발생 여부와 관계없이 finally 블록이나 try-with-resources 문을 사용하여 스트림을 닫아야 한다. 버퍼링과 플러싱:.. 2023. 6. 14.
[Java] Array보다 List를 사용해야하는 이유 자바에서 배열과 리스트(List)는 각각 다른 특징과 용도를 가지고 있다. List를 더 사용해야하는 이유를 정리했다. 크기 조정: 배열의 크기는 선언할 때 정해지고, 이후에는 변경할 수 없다. 반면에 List는 동적으로 크기를 조정할 수 있다. 요소를 추가하거나 제거할 때 List의 크기가 자동으로 조정되므로 편리하다. 삽입과 삭제: List는 요소의 삽입과 삭제가 쉽다. 요소를 삽입하려면 인덱스를 지정하고 값을 추가하면 되며, 요소를 삭제하려면 인덱스나 값으로 제거할 수 있습니다. 배열의 경우 요소를 삽입하거나 삭제하려면 많은 작업이 필요하다. 유연한 자료형: List는 여러 가지 자료형의 요소를 저장할 수 있다. 예를 들어, 정수, 문자열, 객체 등 다양한 유형의 데이터를 한 List에 저장할 수 .. 2023. 6. 13.
[Spring] @Modelattribute, @RequestBody 차이점 @ModelAttribute와 @RequestBody는 둘 다 Spring MVC 프레임워크에서 사용되는 어노테이션으로, HTTP 요청의 데이터를 컨트롤러 메서드에서 처리하기 위해 사용된다. 그러나 두 어노테이션의 사용 방법과 동작에 차이점이 있다. @ModelAttribute @ModelAttribute는 HTTP 요청의 파라미터를 객체로 바인딩하기 위해 사용된다. 컨트롤러 메서드의 파라미터 앞에 @ModelAttribute를 사용하여 해당 파라미터를 객체로 변환하고, 이를 컨트롤러 메서드 내에서 사용할 수 있다. 또한, 이 어노테이션을 사용하면 해당 객체를 자동으로 뷰로 전달된다. 주로 HTML 폼 데이터를 처리할 때 사용된다. 객체 클래스에 @Setter 어노테이션이나 Setter가 필요하다. 예시.. 2023. 4. 26.
[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.. 2023. 3. 7.
[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.. 2023. 1. 23.
[Java] 클래스와 멤버는 접근 권한 최소화하기 1. 개념 - 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 클래스의 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼는지. - 잘 설계된 컴포넌트는 구현과 API를 깔끔히 분리. - API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않음. -> 이는 정보 은닉, 캡슐화 2. 정보 은닉의 장점 시스템 개발 속도를 높임. -> 여러 컴포넌트를 병렬로 개발할 수 있기 때문. 시스템 관리 비용을 낮춤. -> 각 컴포넌트를 더 빨리 파악하여 디버깅 가능하고, 다른 컴포넌트로 교체하는 부담도 적음. 성능 최적화에 도움을 줌. 재사용성을 높여줌. 큰 시스템 제작의 난이도를 낮춰줌. -> 시스템 전체가 완성되지 않은 상태에서도 개별 컴포넌트의 테스트.. 2023. 1. 16.
[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.. 2023. 1. 12.
[Java] private 생성자로 인스턴스화 막기, 의존 객체 주입 사용하기 1. 인스턴스화 막기 - 단순히 정적 메소드와 정적 필드만을 담은 클래스를 만들 때가 있음 *예시 java.lang.Math java.util.Arrays java.util.Collections final 클래스와 관련된 메소드들을 모을 때. - 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아님. - 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만듦. -> 매개변수가 없는 public 생성자가 만들어짐. -> 사용자는 생성자가 자동 생성된 것인지 아닌지 구분할 수 없음. - 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없음. -> 하위 클래스를 만들어 인스턴스화하면 됨. - 이를 막기 위해서는 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수.. 2023. 1. 9.
728x90