1. JAXB(Java Architecture for XML Binding) - JAXB는 Java Object 를 XML 로 직렬화 해주거나, XML 을 Java Object 로 역직렬화 해주는 Java API 입니다. 마샬링(Marshalling) : Java Object -> XML 언마샬링(UnMarshalling) : XML -> Java Object - 기본적으로 JDK6 ~ 9 버전에는 JAXB 가 내장되어 있어 라이브러리를 따로 추가할 필요가 없습니다.(JDK 11 부터는 Dependency 추가가 필요합니다) - 최근 Object 는 관련해서는 대부분 JSON(JavaScript Object Notation)을 많이 사용하지만, XML 도 종종 사용되고 있습니다. - JSON 을 다룰 때..
최근에 회사 동료가 코드 검사를 하겠다며 내가 작성한 코드를 보고 리뷰를 했다. 그러던 중 공통 상수로 선언한 클래스와 Enum 클래스를 사용한 것에 대해 이야기를 하였는데, Enum 을 사용하는데 왜 == 로 비교하지 않고, equals 메소드를 사용해서 비교하는가에 대해 이야기를 하게 되었다. 이 문제에 대해서 간단하게 고민해보고 생각한 것을 포스팅해보려고 한다. 1. 코드 상황 - 간단하게 구현된 코드 상태를 작성해보자면 아래와 같습니다.(이해를 돕기 위한 예제 코드입니다.) Controller @RestController public class MemberController { @PostMapping("") public String memberTest(@RequestBody RequestMembe..
Java 에서 Lambda 를 사용하면서 개발하던 도중 아래 에러 메시지를 보여주면서 빨간 줄이 그어져 있었다. Variable is accessed from within inner class needs to be final or effectively final 대충 직역해보면 "내부클래스(Inner Class)안에 있는 변수에 접근할 때는 그 값이 final 이나 effectively final 형태여야 한다." 이다. 원하던 로직은 Stream 을 사용해서 어떠한 값이 있는 경우 카운트를 하고 싶었다. 이 과정에서 지역변수(cnt)를 람다안에서 사용하고자 하니 위 에러가 발생하였다. int cnt = 0; memberList.stream().forEach(test -> { if(test.getTeam..
스프링으로 개발을 하다 보면 @GetMapping, @RequiredArgsConstructor 등의 다양한 어노테이션을 볼 수 있고, 사용을 하게 된다. 간단하게는 어노테이션을 쓰면 그 어노테이션의 로직(내용)을 컴파일/ 빌드 시 자동으로 추가해주는 것으로 알고 있다. 이렇게 자주 사용하는 어노테이션이지만 동작방식이나 정의되는 방법 등에 대해 정확하게 알고 있다고 생각하지 않아, 좀 더 알아보고 정리해보고자 한다. 1. 어노테이션(Annotation)이란? - 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종. - 보통 @ 기호를 앞에 붙여서 사용.(컴파일러는 컴파일 시 @문자로 시작이 되면 어노테이션으로 판단하여 진행) - JDK 1.5 버전 이상부터 사용 가능. //Example @Req..
1. @SneakyThrows - Java에서 메서드 선언부에 Throws 를 정의하지 않고도, 검사 된 예외를 Throw 할 수 있도록 하는 Lombok 에서 제공하는 어노테이션입니다. 즉, throws 나 try-catch 구문을 통해서 Exception 에 대해 번거롭게 명시적으로 예외 처리를 해줘야 하는 경우에 @SneakyThrows 어노테이션을 사용하여 명시적인 예외 처리를 생략할 수 있습니다. - 예외 클래스를 파라미터로 입력받아 원하는 예외 클래스만 동작하도록 할 수 있습니다. - JVM(클래스파일) 수준에서 검사 여부에 관계없이 모든 예외에 대해 throw 가 동작합니다. - 룸북의 공식 홈페이지에서는 이 어노테이션은 논쟁의 여지가 있어 사용 시 신중하게 사용해야 한다고 말하고 있습니다...
이전에 람다(Lambda)를 정리하면서 Java 1.8 부터 제공하는 람다를 활용하는 스트림(Stream) API에 대해서도 정리하고자 합니다. 기존의 Java 에서는 Collection 데이터(List, Map 등)를 처리할 때 for, while 문 등 특정 조건에 따라 요소 하나씩을 꺼내어 처리하면서 복잡한 과정을 거쳐야 했습니다. 아직도 람다 방식이 익숙치 않고 스트림 API도 종종 사용하지만 올바르게 활용하지는 못하고 있는 것 같아 정리하여 기록해보고자 합니다. 1. Stream 이란? - 데이터를 추상화하고, 처리하는데 자주 사용되는 함수들을 정의한다. 데이터 추상화 : 데이터의 종류에 상관 없이 같은 방식으로 데이터를 처리 - 데이터의 흐름 -> 배열 또는 컬렉션에 함수 여러 개를 조합해서 ..
회사에서 소스를 분석하면서 로그를 기록하는 것에 MDC 라는 것을 사용하고 있었다. (새로운 회사에서 소스 분석하면서 모든게 새롭다... 기존에 내가 사용하던 것들은 어디에...) 간단하게 구글링해보니, 멀티쓰레드 환경에서 스레드 별로 ID를 할당시켜 로깅 추적할 때 원활하게 제공해주는 것이라고 한다고 하는데 이를 정리해보고자 한다. 1. MDC(Mapped Diagnostic Context)란? - Map 형식을 이용하여 클라이언트 특징적인 데이터를 저장하기 위한 메커니즘. - slf4j,logback,log4j2 등 Logger(로거)에서 MDC를 제공한다. - MDC 는 key/value 저장소를 지원하며, 이 저장소는 ThreadContext 에 의존한다. - MDC 클래스는 Map 안에 저장된 ..
최근에 함수형 프로그래밍을 많이 사용하게 되면서, Java 에서도 1.8 버전부터 함수형 방식의 람다(Lambda) 형식을 제공하고 있다. 또한, Java 프로그래밍 중 종종 사용하는 Stream 연산에서도 매개변수로 함수형 인터페이스를 받도록 되어있고, 람다식은 반환값으로 함수형 인터페이스를 반환한다. 이렇게 점점 Lambda 를 자주 접하게 되어 이를 한번 정리하고자 한다. 1. 람다(Lambda)식이란? - 람다식(Lambda Expression)이란 함수를 하나의 식(Expression)으로 표현한 것. - 함수를 람다식으로 표현하면 메소드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류. (함수이지만 함수를 따로 만들지 않과, 코드한줄에 함수를 써서..
Java 언어를 사용해 개발을 하다 보면 DTO, VO 개발을 하다 보면 Lombok(롬복) 이란 라이브러리를 사용하여 개발을 하곤 한다.(물론 아직까지도 안 쓰는 회사도 있기도 하겠지만....) 이번 글에서는 자주 사용하는 Lombok 이란 라이브러리에 대해서 정리해보고자 한다. 1. Lombok 이란? - Java 의 라이브러리로 반복되는 메소드를 Annotation(어노테이션) 기반으로 코드를 자동으로 완성해주는 라이브러리이다. - Lombok 을 이용하면 Getter, Setter, ToString 등과 같은 다양한 코드를 자동 완성시킬 수 있다. - Lombok 을 이용해서 작성한 코드는 컴파일 과정에서 Annotation 을 이용해서 코드를 생성하고 이런 결과물이 .class 에 담기게 된다...
Java 에서 문자열을 다루는 대표적인 클래스로 String, StringBuffer, StringBuilder 가 있습니다. 항상 개발할때 대부분 String으로 사용하였는데, 작은 시스템에서는 크게 이슈가 발생하지는 않습니다. 그러나 큰 서비스와 시스템에서는 연산횟수가 많아지거나 멀티 쓰레드, Race Condition 등의 상황이 발생하면서 무작정 String으로만 사용한다면 성능에 큰 문제가 발생합니다. 이번 글에서는 각 특징을 이해하고, 상황에 맞는 적절한 클래스가 무엇인지 정리해보도록 하겠습니다. 1. String vs StringBuffer/StringBuilder - String 객체는 한번 값이 할당되면 그 공간은 변하지 않으며, 이것을 불변(Immutable)성 이라 합니다. - Str..