개발언어/JAVA 9

Java 9 ~ 17까지 도입할만한 유용한 기능과 예시

Java 9 인터페이스의 private 메소드: 인터페이스에서도 private 메소드를 선언할 수 있게 되었습니다. 이를 통해 코드의 재사용성을 높일 수 있습니다. 메소드 구현의 세부 사항 숨기기: private 메소드는 인터페이스 외부에서는 접근할 수 없으므로, 메소드의 구현 세부 사항을 숨기고 추상화 수준을 높일 수 있습니다. 이는 캡슐화 원칙을 더 잘 지키는 데 도움이 됩니다. 인터페이스의 안정성 향상: private 메소드는 인터페이스의 공개 API의 일부가 아니므로, 이를 변경하더라도 인터페이스를 구현하는 클래스들에게 영향을 미치지 않습니다. 따라서 인터페이스의 안정성을 향상시키는 데 도움이 됩니다. public interface MyInterface { default void myMethod(..

개발언어/JAVA 2023.07.20

[Spring AOP] 1.JDK Dynamic Proxy/CGLIB로 인터페이스 or 클래스 기반의 프록시 객체를 쉽게 생성하는 방법

JDK Dynamic Proxy JDK Dynamic Proxy란? JDK에서 제공하는 Dynamic Proxy 기능을 사용하면 인터페이스 기반의 프록시 객체를 쉽게 생성할 수 있다. JDK Dynamic Proxy는 인터페이스를 구현한 클래스의 객체를 생성할 때 사용한다.(인터페이스가 필수) JDK Dynamic Proxy는 InvocationHandler 인터페이스를 구현한 클래스의 객체를 생성자 파라미터로 넘겨주면 된다. JDK Dynamic Proxy는 인터페이스의 모든 메서드를 구현한 프록시 객체를 생성한다. JDK Dynamic Proxy 예제 공통 기능을 가진 Proxy를 구현 @Slf4j public class TimeInvocationHandler implements InvocationH..

개발언어/JAVA 2022.11.16

[Reflection] 자바가 동적으로 Class, Method의 메타데이터를 획득하여 작동시키는 방법

동적 프록시 프록시를 동작을 원하는 개수만큼 생성해놓는게 아니라, 동적으로 객체를 만들 수 있다. 프록시를 적용할 코드를 하나 만들고, 동적 프록시 기술로 원하는 만큼 찍어내면 된다. 그러기 위해서는 기본적으로 자바가 어떤 클래스, 어떤 메서드던지 획득, 작동을 시킬 수 있어야 한다. 그래서 자바에서는 Reflection API를 제공한다. Reflection API 대표적으로 package명으로 Class를 가져오고, 이름으로 해당 Class의 Method명을 가져오면 된다. 개인적으로는 해당 Class의 Method를 전부 가져와서 Enum으로 메서드명을 value로 가져와서 일치하면 실행시키는 식으로 개발했었다. 예시 @Slf4j public class ReflectionTest { /** * Re..

개발언어/JAVA 2022.11.16

[디자인 패턴] 프록시 패턴(Proxy Pattern), 데코레이터 패턴(Decorator Pattern)

Proxy란? Client(요청자) 와 Server(제공자) 사이에 Proxy(대리인)을 의미한다. 이 Client와 Server는 굉장히 넓은 의미가 될 수 있는데, 여기서는 웹 브라우저 - 웹 서버의 개념이 아닌, 객체간의 호출자와 호출 당한 객체를 의미한다. Proxy 도입 장점 우선, 직접 호출을 하지 않고 대리자를 하나 세웠다는 것 만으로 많은 것을 할 수 있다. (이미 Spring에서 Proxy를 많이 사용한다.) 대상에게 접근을 제어하거나, 캐싱을 할 수 있다. 권한에 대한 접근 차단 캐싱 지연로딩 (client가 프록시를 가지고 놀다가 실제 요청이 들어오면 실 객체를 제공한다) 대상에게 추가적인 기능을 제공할 수 있다. 원래 서버가 제공하는 기능 + 알파 ex) 요청값이나 응답 값을 중간에..

개발언어/JAVA 2022.11.05

[디자인 패턴] 템플릿 메서드 패턴, 전략 패턴

템플릿 메서드 패턴 (Template Method Pattern) 핵심 비즈니스 로직을 제외하고, 동일한 구조를 가진 부가 기능들을 템플릿처럼 변환해서 핵심 로직만 변환해서 찍어내는 패턴이다. 변하는 것과 변하지 않는 것을 분리 핵심 기능은 변하고 로그남기기, 트랜잭션 기능 등은 반복되고 변하지 않는다. 이 둘을 분리해서 모듈화 해야 좋은 코드다. --- 구현 @Slf4j public abstract class AbstractTemplate { public void execute() { long startTime = System.currentTimeMillis(); //비즈니스 로직 실행 call();//상속 //비즈니스 로직 종료 long endTime = System.currentTimeMillis(..

개발언어/JAVA 2022.11.03

동시성 문제 해결(ThreadLocal)

동시성 문제 발생 예시 주로 싱글톤에서 static Field / 인스턴스 Field 등 작업단위에서 공용으로 변수를 접근하여 수정할 경우 동시성 문제가 발생한다. private int id;//인스턴스 변수 public int logic(int uniqueId) { log.info("저장 id={} -> uniqueId={}", id,uniqueId); id = uniqueId; sleep(1000); log.info("조회 uniqueId={}", id); return id; } 이 logic 이란 메서드를 동시에 Thread가 접근하여 실행하면,(여러 사용자가 동시에 사용) 정상 동작 ThreadA -> id 3으로 저장 ThreadA -> id = 3 출력 ThreadB -> id 4로 저장 Th..

개발언어/JAVA 2022.08.31

[모던자바인액션] 2. 스트림 정리

스트림 Collection이란? 자바에서는 이 Collection으로 데이터를 그룹화하고 처리한다. 모든 요리의 칼로리 합이라던지, 칼로리가 50 이하인 음식을 고른다던지 하는 식이다. 데이터베이스에서는 선언형으로 SELECT name FROM dishes WHERE calorie 이런 식으로 구현한다. 위에서 봤듯, SQL 질의는 요리의 속성을 이용하여 어떻게 필터링할 것인지 구현할 필요가 없다. (자바처럼 반복자, 누적자 등을 이용하는 것) 자바 8에서는 이런 식으로 Collection을 처리하고 싶었다. 성능 좋게 멀티코어 아키텍처를 활용해서 병렬적으로. 그렇기에 스트림은 탄생했다. 스트림이란? 스트림을 이용하면 선언형 (즉, 데이터를 처리하는 임시 구현 코드 대신 질의로 표현)으로 Collecti..

개발언어/JAVA 2022.04.05

[모던자바인액션] 1. 람다 정리

람다 람다란? 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. 익명 보통 메서드와 달리 이름이 없어 익명 함수 람다는 메서드처럼 특정 '클래스'에 종속되지 않아 함수라고 칭한다. (but, 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함) 전달 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. 간결성 익명 클래스처럼 자질구레한 코드를 구현할 필요가 없다. 람다를 사용하여 코드를 전달하는 과정에서 판에 박힌 코드를 구현할 필요가 없게 만들어준다. (동작 파라미터 형식의 코드를 더 쉽게 구현할 수 있다) 결과적으로 코드를 더 간결하고 유연하게 만들어준다. ex) //기존 Comparator byWeight = new Comparator() { p..

개발언어/JAVA 2022.04.05

[모던자바인액션] 0. 자바 8 변경점, 개요

왜 주제를 자바8로 정하였는가? 자바 역사를 통틀어 가장 큰 변화가 자바8에서 일어났다. 자바 9에서도 중요한 변화가 있었지만, 8만큼 획기적이거나 생산성이 변한 것은 아니다. 자바 10에서는 형 추론과 관련해 약간의 변화만 일어났다. 자바8의 획기적인 변화란? 자바 8은 프로그램을 더 효과적이고 간결하게 구현할 수 있는 새로운 개념과 기능을 제공한다. 자바 8의 기본적인 변화 관점 1. 간결한 코드 2. 멀티코어 프로세서 사용 멀티코어 CPU 대중화로, 기존 하나의 코어만 사용했던 JAVA에서 나머지 코어 활용을 위해 많은 방법이 나왔다.1버전 쓰레드와 락, 5버전 쓰레드 풀, 병렬실행 컬렉션, 7버전 병렬에 도움이 되는 포크/조인 프레임워크 8버전 스트림 API (병렬 실행을 위한 가장 쉽고 단순한 ..

개발언어/JAVA 2022.02.27
1