JAVA
-
Spring Boot AOP를 이용해 로그인 검증하기JAVA 2024. 7. 29. 23:18
스프링 부트로 개인 프로젝트를 하며 사용자가 로그인을 했는지 권한을 확인할 필요가 있어졌다. 이에 개발하려는 기능 정의를 다음과 같이 했다.AOP를 통해 검증한다LoginCheck 라는 Annotation을 만들어서 이 어노테이션을 기반으로 AOP를 적용한다LoginCheck Annotation은 메소드에도 붙을 수 있고 클래스에도 붙을 수 있다.LoginCheck Annotation은 값을 가질 수 있다. 기본값으로 True를 갖는다. False인 경우 검증하지 않는다. 먼저 어노테이션으로 정의한 이유는 개발을 하며 명시적으로 권한이 필요하다는것을 표시해주고 싶었기 때문이다. Controller에 LoginCheck 이라는 어노테이션이 있다면 다른 개발자가 보더라도 권한이 필요한 영역이라 쉽게 유추할것..
-
Spring Boot MessageConverterJAVA 2024. 6. 24. 01:29
개요Spring Boot 기반 개인 프로젝트를 진행하는중 MessageConverter 관련해 문제가 있었다. 이 문제를 해결하며 알게된 내용을 정리해보았다. 문제@GetMapping("/test2")public String test2(){ return "test 2";}@GetMapping("/test3")public List test3(){ return List.of("t","e","s","t");}기존 코드의 Controller 부분이다. /test2 에 요청하면 String 을 반환하고, /test3 에 요청하면 ["t","e","s","t"] 를 반환한다.public Object beforeBodyWrite(@Nullable Object body, MethodParameter retu..
-
Java mutable 과 immutableJAVA 2023. 10. 8. 23:06
Mutable 과 Immutable Java에는 가변(mutable)객체와 불변(immutable)객체가 존재한다. 가변 객체는 힙 영역에 생성된 객체를 변경할 수 있는 객체이고 불변 객체는 반대로 힙 영역에 생성된 객체를 변경할 수 없는 객체이다. 대표적인 불변 객체인 String 으로 예시를 보면 다음과 같다. String val1 = "abc"; System.out.println("val1 initial " + System.identityHashCode(val1)); val1 += "xyz"; System.out.println("val1 after "+System.identityHashCode(val1)); // output val1 initial 1435804085 val1 after 179828..
-
Java와 일급 함수JAVA 2023. 9. 18. 18:26
일급함수 프로그래밍 언어는 해당 언어의 함수들이 다른 변수처럼 다루어질 때 일급 함수를 가진다고 합니다. 예를 들어, 일급 함수를 가진 언어에서 함수는 다른 함수들에 전달인자로 제공되고, 다른 함수에 의해 반환될 수 있으며, 변수에 값으로서 할당될 수 있습니다. 일급 객체가 되기위한 충족 조건은 세가지가 있다. 변수나 데이터에 할당 할 수 있어야 한다. 객체의 인자로 넘길 수 있어야 한다. 객체의 리턴값으로 리턴 할 수 있어야 한다. Java 에서는 위의 조건을 충족하지 않지만, 람다식을 이용하여 함수의 매개변수로 전달 할 수 있다. 함수형 인터페이와 람다 구현해야 할 abstract method를 하나만 갖고 있는 인터페이스를 함수형 인터페이스라고 한다. @FunctionalInterface 어노테이션..
-
Java Generic Compile 동작JAVA 2023. 9. 11. 14:42
Java 의 Generic Java에는 Generic이라는 이라는 기능이 있다. Generic 이라는 기능은 JDK 1.5 부터 도입된 기능인데 이전 자바 버전의 코드와의 호환성은 어떤식으로 유지하는걸까? 이를 위해 Type Erasure라는 기능으로 컴파일 시에는 Generic type을 제거하게 된다. 이와 관련하여 간단하게 확인해 보자. Reifiable 과 Non-Reifiable Refiable Type (구체화 타입) 타입 정보를 런타임시에 알고 구체화 하는것. 컴파일 단계에서 Type Erasure에 의해 지워지지 않는다. 일반적인 타입과 unbound wildecard type 등이 포함된다. Non-Reifiable Type (비구체화 타입) 타입 정보가 런타임때 사라지는것. 컴파일 단계..
-
JVM Memory AreaJAVA 2023. 9. 8. 16:46
JVM Architecture Class Loader JVM 내로 .class 파일들을 Load 하여 Loading된 클래스들을 Runtime Data Area에 배치한다. JVM Memory Runtime Data Area 라고도 하며 JVM이 OS에서 할당 받은 메모리 공간이다 Execution Engine Runtime Data Area에 할당됭 ByteCode 를 실행하는 역할을 한다. Interpreter, JIT compiler, Garbage Collector 로 구성되어있다. Native Method Libraries 실행에 필요한 C,C++로 이루어진 Native Libraries 이다. Native Method Interface (JNI) JVM이 Native Method Librari..
-
Java 버전 별 ArrayList add 동작JAVA 2023. 9. 6. 18:51
Java 6 public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } Java 6 에서 ArrayList add이다. ensureCapacity에 현재 size +1을 전달하여 크기를 확인한다. public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; ..
-
Java Thread Safety 한 개발JAVA 2023. 8. 29. 18:23
Thread Safe 개발을 하다보면 Multi-Thread 환경에서 작업해야하는 경우가 있다. 이때 공유되는 자원등에 대해 Thread-safe 하게 작업하는것이 중요하다. Thread-safe 하나는것은 여러 스레드에서 클래스 혹은 객체헤 동시에 접근하여도 정확하게 동작하는것을 의미한다. Thread Safe 하게 개발하기 Synchronized Java에서 가장 간단하게 Thread-Safety 하게 개발하는 방법은 synchronized keyword를 사용하는 것이다. public class IncreaseNumber{ public int number; public synchronized int increase(){ return number++; } } 위처럼 synchronized keywor..