Programming/Java 66

@PostConstruct 어노테이션을 통한 스프링 빈(Bean) 초기화 콜백

@PostConstruct 어노테이션이 사용되는 이유를 알아보기 위해 먼저 스프링 빈의 생명주기에서 부터 초기화 콜백이 무엇인지, 어떤 용도로 쓰이는지에 대해 살펴보겠습니다. 스프링 프레임워크는 IoC(Inversion of Control) 컨테이너를 통해 Bean 객체들을 관리하는데요. 인스턴스 생성부터 소멸까지의 생명주기 관리를 개발자가 아닌 컨테이너가 대신해주기 때문에 개발자는 로직에 집중할 수 있다는 장점이 있습니다. (즉, 객체 관리 주체가 프레임워크가 되는 것입니다.) 스프링 빈 생명주기(Bean LifeCycle) 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 콜백 -> 스프링 종료 Spring Bean은 다음과 같은 생명 주기를 가지..

Programming/Java 2023.01.08

Java Iterable Iterator 차이점 정리

지금까지 java를 배우고 실무에 활용하면서 Iterator, Iterable을 직접적으로 쓴 적은 한 번도 없었는데요. 최근 다른 코드에서 해당 인터페이스들을 사용하는 것을 보고 무슨 기능을 하는지 궁금해서 정리한 내용입니다. Iterator Iterator는 Java Collections Framework에 속해있으며, java 1.2에서 발표된 인터페이스입니다. Iterator는 Collection에 저장된 요소를 읽어오는 것을 표준화한 인터페이스로 데이터를 하나씩 읽어올 때 사용되는데요. 다음 요소를 가지고 있으면 true를 반환하는 hasNext() 메서드와 다음 요소를 반환하는 next() 메서드가 있으며, default 메서드로 해당 iterator로 반환된 요소를 제거하는 remove() ..

Programming/Java 2022.12.02

로깅시 System.out.println() 사용을 지양해야 하는 이유

Java 프로그래밍을 처음 접하게 되면 거의 대부분이 다음과 같이 "Hello World"를 콘솔에 출력하는 것에서부터 시작하게 됩니다. 이때 사용되는 출력 방법인 System.out.println() 메서드는 자바 표준 입력 클래스인 System을 사용하기 때문에 클래스 경로에 추가해야 될 라이브러리나 추가 구성이 필요 없기 때문에 간편하고 쉽게 사용할 수 있다는 장점이 있는데요. 하지만 프로덕션 코드(Production Code)에서는 System.out.println() 메서드를 통한 출력이 지양되는데, 그 이유는 무엇인지 살펴보겠습니다. /* 로깅(Logging)이란? 로깅은 프로그램 실행 동작을 일련의 기록인 로그(Log)의 생성을 통해 남겨놓는 일을 말합니다. 로그는 재현하기 힘든 버그나 성능..

Programming/Java 2022.11.16

Java Enum 활용하기2 - ConverterFactory

Java Enum을 활용한 방법 중 두 번째, ConverterFactory 인터페이스를 구현한 CustomConverter를 만들어 HTTP 요청에서 Enum 값을 받을 때 Enum 값 자체를 받는 것이 아니라 legacyCode를 받아 자동으로 Enum으로 형 변환하는 방법입니다. @GetMapping("/user/{idx}") public ResponseEntity getUserDetail(@PathVariable Long idx) { ... } 스프링에서 HTTP Query String을 통해 전달되는 정보는 모두 문자열(String)로 인식됩니다. (HTTP 요청 파라미터는 모두 문자열로 처리) 하지만 위 예시와 같이 컨트롤러에서 Long (또는 Integer, boolean Enum 등)으로 ..

Programming/Java 2022.10.08

JPA @OneToOne 일대일 연관 관계 정리 및 LazyLoding 이슈

JPA를 사용하면서도 연관 관계 매핑을 쓰지 않다가 이번 프로젝트에서 연관 관계를 적용하기 시작하며 정리한 내용이며, JPA 연관 관계 매핑 중에서 1:1 연관 관계인 @OneToOne에 대해 정리한 내용입니다. @OneToOne 일대다(1:N), 다대일(N:1) 관계에서는 다(N) 쪽이 항상 외래 키를 가지고 있지만, 일대일(1:1) 관계에서는 주 테이블이나 대상이 되는 테이블 양쪽 모두 외래 키를 가질 수 있습니다. 때문에 일대일 관계를 적용할 때는 주 테이블과 대상이 되는 테이블, 어느 쪽에 외래 키를 둘지 선택해야 하는데요. JPA에서는 외래 키를 갖는 쪽이 연관 관계의 주인이 되고, 연관 관계의 주인이 데이터베이스 연관 관계와 매핑되어 외래 키를 관리(등록, 수정, 삭제)할 수 있기 때문에 해당..

Programming/Java 2022.10.02

Java Enum 활용하기1 - AttributeConverter

Java Enum을 활용한 방법 중 첫 번째, AttributeConverter 인터페이스를 구현한 CustomConverter를 만들어 DB에는 Enum의 legacyCode 값으로 데이터를 저장하고, Java에서는 DB에 legacyCode 값으로 저장된 데이터를 다시 Enum으로 변환해서 사용하는 방법입니다. AttributeConverter의 기본적인 사용 방법 예시 @Getter public enum UserState { NORMAL("정상", 1), SUSPENSION("정지", 2), WITHDRAWAL("탈퇴", 3); private String desc; private Integer legacyCode; UserState(String desc, Integer legacyCode) { th..

Programming/Java 2022.10.01

Java 정규표현식 사용하기(Regular Expression)

일반적으로 클라이언트로부터 입력되는 데이터에 대한 validation은 프론트엔드에서 먼저 처리됩니다. 하지만 악의적인 의도로 프론트를 거치지 않고 유효성에 대한 검사가 이뤄지지 않은 데이터를 서버에 직접 보내게 된다면 문제가 발생할 수 있는데요. 때문에 서버 역시 들어오는 데이터에 대한 validation 처리가 필요한 것입니다. 1. 정규표현식(Regular Expression)이란? 정규식은 프로젝트 개발에 있어서 빠지지 않고 사용되는 부분으로 "특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어"라고도 표현되는데요. 정규표현식은 이메일, 휴대폰 번호, 주민번호 등의 형식이나 비밀번호 같이 입력값이 정해진 형식에 맞는지 검증해야 할 때 유용하게 사용됩니다. 정규표현식을 사용할 때 이..

Programming/Java 2022.09.07

LocalDate 해당 월의 마지막 날짜 구하는 방법

JDK1.8부터 기존의 Calendar 클래스와 Date 클래스를 보안하기 위해 java.time 패키지가 등장했고, 해당 패키지에는 날짜와 시간을 나타내는 클래스들이 있는데요. 그중에서 날짜 정보를 나타내는 LocalDate를 사용할 때 해당 월의 마지막 날짜를 구해야 하는 경우가 있는데, 해당 방법을 정리한 내용입니다. //기준일자 LocalDate date = LocalDate.parse("2022-09-04"); //해당 월의 첫째 날 LocalDate firstDate = date.withDayOfMonth(1); // 2022-09-01 //해당 월의 마지막 날 LocalDate lastDate = date.withDayOfMonth(date.lengthOfMonth()); // 2022-09..

Programming/Java 2022.09.04

Java - BigDecimal 사용하는 이유 (feat.부동소수점의 부정확성)

Java 기반 프로그램에서 소수점에 대한 정확한 계산이 필요하거나 화폐 단위를 다룰 때는 BigDecimal을 사용하는데요. 자바에서 숫자를 표현하는 데이터 타입에 대해서 간단하게 살펴보고, 이어서 BigDecimal을 사용해야 하는 이유는 무엇인지 살펴보겠습니다. Java에서 숫자를 표현하기 위한 데이터 타입 자바에서 숫자를 표현하기 위해 사용하는 데이터 타입은 크게 '정수형 데이터 타입'과 '실수형 데이터 타입'으로 나눠집니다. - 정수형 데이터 타입(Integer Types) 데이터 타입 (자료형) 크기 저장 가능한 값의 범휘 byte 1byte (8bit) -128 ~ +127 short 2byte (16bit) -32,768 ~ + 32,767 int 4byte (32bit) -2,147,483..

Programming/Java 2022.08.18

Java 위도 경도에 따른 거리 계산(내 주변 반경)

위도 경도에 따른 거리 계산 및 내 주변 일정 거리 이내에 있는 대상들을 판단하기 위해 작업된 코드 및 내용을 정리한 것입니다. 먼저 위도와 경도의 정의에 대해서 간단하게 살펴본 뒤 코드를 이어서 보겠습니다. (코드만 필요하신 분들은 윗부분은 살짝 스킵하셔도 될 것 같습니다.) 위도(latitude), 경도(longitude) '위도'는 적도를 기준으로 북위(N), 남위(S)로 나뉘며, 각각 0° ~ 90°로 표현합니다. 같은 위도를 연결한 가로선을 위선이라고 합니다. '경도'는 영국의 그리니치 천문대를 기준(0°)으로 하여 동쪽과 서쪽을 각각 180°로 표현합니다. 같은 경도를 연결한 세로선을 경선이라고 합니다. 우리나라의 위도와 경도 기준점은 경기도 수원에 있는 국토지리정보원이며, 이곳의 위도와 경도..

Programming/Java 2022.08.03