본문 바로가기

Java95

[Java] 자바 어노테이션(Annotation) 사용법 및 예제 - 커스텀 어노테이션 만들기 스프링 프레임워크 기반의 작업을 많이 하는 개발자라면 '어노테이션(Annotation)'을 자주 사용할 것이다. (어노테이션, 애너테이션 등으로 발음하지만 본 포스트에서는 어노테이션으로 명명하겠다) 하지만 스프링 프레임워크를 사용하는 개발자들도 그냥 관용적으로 어노테이션들을 사용하는 경우가 많고, 자바 어노테이션 자체에 대해서 크게 고민해보지 않은 경우가 많이 있다. 1. 자바 어노테이션(Annotation) 자바에서 어노테이션은 사전적의미로는 주석이라는 뜻을 가지고 있다. 자바의 어노테이션은 소스코드에 추가해서 사용할 수 있는 메타 데이터의 일종이다. 메타 데이터란 애플리케이션이 처리해야할 데이터가 아니라 컴파일 과정과 실행 과정에서 코드를 어떻게 처리해야하는지를 알려주기 위한 추가 정보다. 자바의 어.. 2022. 10. 7.
[Java] ERROR StatusLogger No Log4j 2 configuration file found. 에러 확인방법 자바를 이용해 프로그램을 작성하다가 다음 에러 메시지를 만나게 되었다. ERROR StatusLogger No Log4j 2 configuration file found. 프로그램의 실행에는 문제가 없었지만 매번 실행할 때마다 경고 메시지가 화면에 출력되어 신경이 쓰였다. 원인 log4j2에 대한 설정 파일을 찾을 수 없어서 발생하는 문제다. 프로젝트의 리소스 디렉토리나 클래스 패스에 log4j2.xml 파일을 생성해 설정을 넣어주면 더 이상 에러메시지가 출력되지 않는다. 2022. 9. 8.
[Java] log4j:WARN No appenders could be found for logger 에러 해결방법 IntelliJ에서 자바 프로젝트를 실행했을 때 다음과 같은 경고 메시지가 출력되었다. log4j:WARN No appenders could be found for logger log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 개발중인 프로그램을 실행하는데에는 문제가 없지만 매번 경고 메시지가 출력되는 것이 신경쓰였다. 경고 메시지가 출력되지 않도록 조치를 취해보자. 원인 메시지의 내용에서 알 수 있듯이 이 메시지는 log4j 관련 메시지다. log4j는 자바로 작성된 애플리케이션에서 로그를 기록하기 위해 .. 2022. 9. 6.
[Java] Java Reflection 소개 및 사용법, 예제 자바 리플렉션(Java Reflection)은 구체적인 클래스의 타입을 알지 못하는 상황에서그 클래스에 구현되어 있는 메소드와 필드 등의 정보, 즉 클래스의 구조를 확인할 수 있도록 자바가 제공해주는 API다. 리플렉션은 자바에서 제공해주는 API이기 때문에 별도의 jar 파일을 포함하거나 Maven 의존성을 추가하지 않아도 사용할 수 있다. 일반적으로 자바 리플렉션은 많이 사용되지는 않는다. 다만 프레임워크(Frame Work) 소프트웨어를 작성하거나 IDE 같은 소프트웨어를 작성하는 경우 사용자가 나중에 어떤 타입의 클래스를 사용할지 소프트웨어를 작성하는 당시에는 알지 못하는 경우가 많이 있다. 이 때, 런타임에 사용자가 넘겨준 클래스의 정보를 분석해서 동작할 수 있도록 리플렉션을 이용해 코드를 작성.. 2022. 8. 12.
[Java] ConcurrentModificationException 원인과 해결방법 자바 언어로 프로그래밍을 하다보면 가끔씩 ConcurrentModificationException을 만나게 된다. ConcurrentModificationException의 발생 원인과 해결방법에 대해서 간단하게 소개하겠다. ConcurrentModificationException ConcurrentModificationException은 몇 가지 상황에서 발생할 수 있는데, 가장 흔한 것이 컬렉션을 순회하면서 순회하는 대상 컬렉션에 수정을 가하는 경우다. 다음 코드를 실행하면 ConcurrentModificationException이 발생한다. List list = new ArrayList(); list.add("str1"); list.add("str2"); list.add("str3"); for (S.. 2022. 5. 26.
[Java] 메모리 가시성(Visibility) 소스코드의 특정 블럭을 동기화시키고자 할 때, 항상 메모리 가시성(Memory Visibility) 문제가 발생한다. 특정 변수의 값을 사용하고 있을 때 다른 스레드가 그 변수의 값에 접근하지 못하도록 막아야 하는 ‘상호배제’도 중요하지만 값을 수정한 다음 동기화 블록을 빠져나가고 나면 다른 스레드가 변경된 값을 즉시 사용할 수 있어야 하는 ‘가시성(Visibility)’도 중요하다. 메모리 가시성(Memory Visibility) 싱글 스레드 환경에서는 프로그램의 코드가 특정 변수에 값을 수정한 다음 다시 그 변수의 값에 접근해보면 이전에 수정한 값을 다시 가져올 수 있다. 멀티 스레드 환경에서는 반드시 수정한 값을 읽는 것이 보장되지는 않는다. 공유 변수에 대해서 어떤 스레드가 값을 수정했을 때, 그.. 2022. 5. 15.
[Java] synchronized 키워드 -고유락(Intrinsic Lock) 자바는 멀티스레드 환경에서 동기화를 지원하기 위해 가장 기초적인 장치인 '고유락(Intrinsic Lock)'을 지원한다.(고유락은 모니터락(Monitor lock) 혹은 모니터(monitor)라고 부르기도 한다) 개발자는 synchronized 키워드를 이용해서 특정 객체의 고유락을 사용해 여러 스레드를 동기화 시킬 수 있다. Java의 synchronized 자바의 synchronized 블럭은 다음과 같이 생겼다. synchronized(obj) { // critical section } synchronized 블럭은 객체를 필요로 한다. 동일한 객체에 대해서 synchronized 블록을 사용하는 두 스레드는 한 번에 하나의 스레드만 synchronized 블록 내부로 들어갈 수 있다. 자바에서 .. 2022. 4. 7.
[Java] 자바 병렬 프로그래밍 - 멀티 스레드의 장단점 복잡한 프로그램이 제대로 동작하도록 코드를 작성하는 일은 어렵다. 하지만 그 복잡한 프로그램이 빠르면서 제대로 동작하도록 작성하는 것은 더욱 어렵다. 즉, 어떤 작업들을 순차적으로 실행하는 프로그램보다 동시에 여러 작업들이 수행되도록 프로그램을 작성하는 것은 더욱 어렵다. 자바에서는 스레드를 이용해 프로그램의 여러 작업들을 동시에 실행하도록 해준다. 하나의 자바 프로그램에서 여러 스레드가 동작한다는 의미는 하나의 자바 프로그램이 여러 개의 프로세서를 활용해 최대한 성능을 끌어올린다는 것을 의미한다. 잘 알려져 있듯이 CPU의 성능을 향상시키기 위해 클럭 속도를 빠르게 올리는 방향에서 코어의 개수가 늘어나는 방향으로 전환되었다. 클럭 주파수를 끝없이 올리기엔 물리적인 한계가 있기 때문이다. CPU 코어의 .. 2022. 3. 15.
[Java] 스레드 그룹(Thread Group) JVM에서 생성되는 스레드들은 모두 어떤 스레드 그룹(Thread Group)에 속해 있다. 스레드 그룹은 연관되어 있는 스레드들을 묶어서 관리하기 위해 사용된다. JVM이 시작되면 system 스레드 그룹이 생성된다. GC를 담당하는 Finalizer 스레드를 비롯하여 JVM 운영에 필요한 몇 가지 스레드들이 생성되어 system 그룹에 포함된다. 이후 system 스레드 그룹의 하위 그룹으로 main 스레드 그룹이 생성되고, main 메서드를 실행하는 main 스레드가 포함된다. 새로운 스레드를 생성할 때, 스레드 그룹을 지정할 수 있다. 만약 스레드가 포함될 스레드 그룹을 지정하지 않았다면 스레드를 생성하는 스레드가 포함된 스레드 그룹에 기본적으로 속하게 된다. 스레드 그룹 확인 특정 스레드가 어떤.. 2022. 2. 26.