개발언어 11

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

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

개발언어/JAVA 2023.07.20

코틀린 vs 자바

자바가 있는데 굳이 코틀린을 배워야해? 라고 생각한 뒤, 생각을 고쳐먹고 최근 코틀린을 배우기로 생각했습니다. 그래서 코틀린이 자바보다 좋은 이유들을 찾고 있습니다.그것에 대한 정리글입니다. 간결한 문법: Kotlin은 더 간결한 문법을 제공하여 코드를 더 간결하게 작성할 수 있습니다. 예를 들어, Nullable 타입, 확장 함수, 데이터 클래스 등의 기능을 활용하여 코드를 더 간단하고 명확하게 작성할 수 있습니다. // Java 코드 String name = "John"; if (name != null) { System.out.println(name.toUpperCase()); } // Kotlin 코드 val name: String? = "John" println(name?.toUpperCase()..

개발언어/KOTLIN 2023.07.18

[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

성격 급한 사람을 위한 ‘빨리빨리 FileCopy, Move’ 제작기 (GoLang을 곁들인)

성격 급한 사람을 위한 ‘빨리빨리 FileCopy, Move’ (GoLang을 곁들인) 개요 평소 윈도우에서 File들을 옮기거나 복사할 때, 속도가 느려서 답답할 때가 많았다. 그래서 불편함을 개선하고자 GoLang으로 `빨리빨리FileCopy,Move` 를 짜봤다. GoLang 선정 이유 고루틴, 채널이 있어서 병렬 처리가 간단하다. 동기화 문제 스레드를 명시적으로 주지 않고 고루틴을 생성하면 알아서 스레드를 생성해주고 적절한 스레드에 고루틴을 할당합니다. goroutine 사이의 커뮤니케이션을 채널이란 것을 통해서 소통하기 때문에, 따로 동기화 문제도 신경쓰지 않아도 된다. 쓰레드 관리 고루틴은 멀티스레드 메커니즘이지만 자체적인 스케줄러에 의해 관리되는 경량 스레드이며 OS에서 관리하는 경량 스레드..

개발언어/GO 2022.06.24

[모던자바인액션] 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
1 2