Dev 91

Java Stream ( feat. Optional 과 collect )

이전 포스팅은 여기로 2024.03.11 - [개발/java] - 람다식 ( Lamda expression ) / @FunctionalInterface 예제 소스 링크 본 게시글의 예제 코드를 이해하기 위해서는 람다식과 메서드 참조 ( 더블 콜론 )에 대한 이해가 있어야 하므로, 해당 내용에 대해 모른다면 위에 있는 이전 포스팅을 읽어보는 것을 추천한다. 왜 스트림이 등장했을까? for, Iterator 를 이용해서 코드를 짜게 되면, 재사용성과 가독성이 떨어진다는 단점이 있다. Collection 이나 Iterator 만 봐도 같은 기능의 메서드들이 중복되어 있고, List와 배열 정렬 시에도 동일한 sort() 함수를 사용하지만 각각 Collections.sort(), Array.sort()를 사용해..

Dev/Java 2024.03.18

OSIV 를 통한 성능 최적화 ( Connection 관리 관점 )

OSIV 란 뭘까? OSIV는 Open Session In View의 약자로 spring.kpa.open-in-view 옵션을 통해 application.properties 또는 yml 파일에서 On / Off 설정을 할 수 있다. OSIV의 기본값은 true 이다. ( on 상태를 의미한다. ) 기본적으로, 트랜잭션을 시작할 때 JPA의 영속성 콘텍스트는 데이터베이스 커넥션을 가져온다. OSIV는 트랜잭션이 끝나도 사용자에게 Response 가 반환 될 때까지 영속성 콘텍스트와 데이터베이스 커넥션을 끝까지 살려주는 역할을 한다. OSIV - On OSIV 가 On 이면 위 그림과 같이 요청에서 응답까지 이르는 모든 범위에서 영속성 콘텍스트와 데이터베이스 커넥션이 살아 있다. 이렇게 모든 범위에서 영속성..

Dev/JPA 2024.03.15

JPA 에서 Collection 조회시 주의점 및 성능 튜닝 방법

Entity -> Dto 변환 시 Collection 도 잊지 말고 변환해야 한다 Collection을 dto 로 변환하여 리턴할 경우에도 엔티티에 대한 의존도를 끊어야 한다. 예시 코드를 보자. 흐름도 Order 엔티티 정보 @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) // 지연로딩 @JoinColumn(name = "member_id") private Me..

Dev/JPA 2024.03.15

HttpUrlConnection을 사용하여 외부URL Data Scrapping 하기

restfulAPI를 개발하다 보면 제공할 정보를 위해 만드는 경우도 많지만 반대로 필요한 OpenAPI 에 접근하여 원하는 데이터를 긁어와야 할 때도 많다. 실무에서 꽤 자주 썼는데 따로 정리한적은 없는 것 같아서 내가 실제로 자주 썼던 샘플코드를 하나 가져와봤다. 개발 환경 IDE : intelliJ FrameWork : springboot 3.2.2 / JPA(Hibernate5) Launguage : java 17 BuildTool : Gradle TestTool : Junit5 구현 내용은 다음과 같다 ResponseScrap @Getter @AllArgsConstructor(access = AccessLevel.PROTECTED) @NoArgsConstructor(access = AccessL..

Dev/Springboot 2024.03.14

ElaticSearch 란 무엇일까? 동작 방식을 이해해보자

본 글은 인프런의 ElasticSearch 강의를 듣고 정리한 내용이다. 출처가 궁금하신 분들은 아래 링크를 참조하면 좋겠다. https://www.inflearn.com/course/elasticsearch-essential/dashboard ElasticSearch Essential 강의 - 인프런 ElasticSearch 클러스터를 운영하기 위해 꼭 알아야 할 내부 동작에 대한 이해, 모니터링하는 방법, 사례를 기반으로 한 트러블 슈팅 방법을 알려주는 강의입니다. 이 강의를 통해 ElasticSearch 클러스 www.inflearn.com ES 적용 전에 ES 가 무엇인지, 어떻게 동작하는지에 대해 정리하는 게 필요하다고 생각해서 듣게 된 강의인데 아무래도 ES를 이미 적용해서 사용하고 있는 분들..

Dev/ELK 2024.03.14

MacOS 에서 ElasticSearch 설치하기 ( homebrew 사용 X )

Open API 통해서 데이터를 긁어온 뒤 검색 엔진에 ElasticSearch를 연동하는 토이 프로젝트를 해보고 싶어서 사용 방법을 익히기 위해 설치를 진행했다. 새로운 내용을 학습할 때 인프런을 통해 많이 찾아보는 편인데 딱히 강의랄게 없어서 공식 홈페이지를 참고하거나 구글링과 유튜브의 힘을 빌려서 진행했다. ( 처음 하는건데 따라 할만한 명확한 참고 문서를 못 찾아서 하다가 조금 늙었다 ) 개발환경 OS : Mac OS 13.4 / Mac m2 JDK : 17 ES ( ElasticSearch) 다운로드 및 실행 ES는 기본적으로 JVM 위에서 돌아가기 때문에, jdk는 설치되어 있어야 한다. 본 글에서는 jdk는 이미 설치되었다는 가정하에 글을 작성한다. jdk를 설치했다면 두 번째로 해야 할 것..

Dev/ELK 2024.03.13

익명 클래스(annoymous class)

익명 클래스란 무엇인가? 익명 클래스는 이름이 없는 클래스를 의미한다. 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한 번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있는 일회용 클래스이다. 익명 클래스는 다음과 같은 특징을 가진다. 생성자를 가질 수 없다 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다. 즉 오로지 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다. 예시 코드로 나타내면 다음과 같다. // 익명 클래스를 사용하지 않은 경우 class Innerclass { public static void main(String[] args) { Classb b = new ClassB("make"); b.addActionLi..

Dev/Java 2024.03.12

다형성(Polymorphism)과 참조변수 ( with. instanceof 연산자의 필요성)

다형성과 참조변수 객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며 자바에서 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현할 수 있다. 즉 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하는 것이다. Class Tv { boolean power; int channel; void power(); void channelUp(); void channelDonw(); } class CaptionTv extends Tv { String next; void caption() ... } Tv 클래스와 CaptionTv 클래스가 다음과 같이 정의 되어 있을 때 두 클래스를 생성하고 사용하는 방법은 일반적으로 다음과 같..

Dev/Java 2024.03.12

람다식 ( Lamda expression ) / @FunctionalInterface

본 글에서는 기본적인 람다사용 법과 람다를 사용하는 이유에 대해 작성하고자 한다. 예제소스링크 람다식이란? jdk 1.8부터 추가된 람다식은 자바를 객체지향언어인 동시에 함수형 언어로 만들었다. 람다식이란 메서드를 하나의 식(expression)으로 표현한 것이다. 메서드는 객체 지향에서 객체의 행위나 동작을 의미하는 용어인데, 클래스에 반드시 속해야 한다는 제약이 있다. 모든 메서드는 클래스에 포함되어야 하므로 클래스도 새로 만들어야하고, 객체도 새로 만들어야 하지만 람다식은 오직 람다식 자체만으로도 이 메서드의 역할을 대신할 수 있게 해준다. 메서드를 람다식으로 변환하면 메서드의 이름과 반환 값이 사라지게 된다. 다음 예제를 보면 쉽게 이해할 수 있다. 일반적인 메서드 int max(int a, in..

Dev/Java 2024.03.11

WebApplication 의 Exception 처리

예제 파일 링크 바로가기https://github.com/gahyeonkwon/dev_study/tree/main/exceptiondemo/src/main  Exception과 logging 은 개발할 때마다 가장 고심하는 부분이다.  spring 프레임워크에서 제공하는 Exception 처리는 사용하기 편리하지만 실제로 웹 애플리케이션이 어떻게 Exception을 전달하는지에 대해 정리 필요성을 느껴 글을 작성하게 되었다. Exception 이 전달 되는 순서Exception 이 발생하면 Controller -> Interceptor -> Servlet -> Filter -> Was 순으로 전달이 된다. 일반적으로 Exception 은 Try - Catch 구문을 통해 Servlet 내에서 처리되지만,..

Dev/Springboot 2024.03.10