분류 전체보기
Graceful Shutdown - JVM, Java, SpringBoot
Graceful Shutdown의 사전적 의미 : 정상적인 종료 Graceful shutdown은 프로그램이 종료될 때 최대한 side effect를 내지 않기 위해 로직들을 잘 처리하고 정상적으로 종료하는 것을 의미한다. 운영체제(OS), 애플리케이션, 브라우저 등 모든 소프트웨어에 통틀어서 말할 수 있는 개념이다. Graceful Shutdown의 상반되는 의미로 Hard Shutdown이 있다. Gracueful Shutdown(정상적인 종료) : 사용자가 소프트웨어 기능을 이용하여 정상적으로 프로세스를 종료시키고 종료하는것 Hard Shutdown(강제 종료, 비정상 종료) : 천재지변, 전원 차단(코드뽑기), 하드웨어 오류(메모리부족 등)에 의해 의도치 않게 비정상 종료되는 것 왜 Gracefu..
JaCoCo
JaCoCo는 자바 코드 커버리지를 체크하는 데에 사용되는 오픈소스 라이브러리 이다. 테스트를 실행하고, 그 커버리지 결과를 html 파일이나 csv, xml 파일을 통해서 시각화 하여 볼 수 있다. 또한, 결과에 대한 기준치를 적용하여 기준을 만족시키지 못 하면 배포, 커밋 빌드 실패 등을 적용 할 수 있다. 특히 코드정적분석도구인 sonarqube와 연계하여 사용하는 경우가 많다. Jacoco는 Java 바이트 코드를 기반으로 정적으로 커버리지를 측정해준다. http://www.semdesigns.com/Company/Publications/TestCoverage.pdf TestCoverage 측정 방법에 대한 논문이다. 공식 홈페이지 : https://www.jacoco.org/ 릴리즈 버전 : h..
코드 커버리지(Code coverage)
Coverage의 사전적 뜻 : 적용 범위 코드 커버리지란, 소프트웨어의 Test Case가 얼마나 충족되었는지, TestCode가 Production Code를 얼마나 실행했는지를 백분율(%)로 나타내는 지표 중 하나이다. Test를 진행하였을 때, '코드 자체가 얼마나 실행되었는지'를 나타내는것이고 이는 수치를 통해 확인할 수 있다. 즉 Test Code가 Production 코드를 얼마나 검증하고 있는지를 수치(혹은 %)로 나타내고 이 커버리지를 통해 현재 작성된 Test Code의 수가 충분한 것인지 논의할 수 있다. 원래 원칙적으로 test code는 모든 시나리오에 대해서 설계되어야 한다. 실제로 배포하는 서비스라면 더욱더 모든 시나리오를 커버해야만 한다. 그러나 현실적으로 내가 지금 작성한 ..
Jpa ArrayType. PostgreSQL Array Type을 저장하는 방법 - Hibernate Types, List, Array
PostgreSQL을 포함한 몇몇 RDB에서는 Array Type의 컬럼 유형을 지원한다. 그러나 hibernate에서 제공해주는 기본 Type들은 Array Type을 지원하지 않는다. 개발자는 Hibernate Type을 Custom 구현해서 사용하거나, 라이브러를 이용해서 PostgreSQL ArrayType을 Spring-data-jpa를 이용해서 hibernate로 매핑할 수 있다. 테스트에 사용된 도메인 엔티티는 다음과 같다. 도메인 엔티티 @Entity public class User { @Id private Long id; private String name; private String[] roles; private List hobbies; } 1. Custom Hibernate Type ..
Lambda 표현식
람다식(Lambda Expression) JDK1.8부터 추가된 람다식의 도입으로 인해서 이제 자바는 객체지향언어인 동시에 함수형 언어가 됐다. 객체지향언어가 함수형 언어의 기능까지 갖추게 하는 일은 쉬운 일이 아니었을텐데도 기존의 자바를 거의 변경하지 않고도 함수형 언어의 장점을 잘 접목시키는데 성공했다 람다식이란, 메서드를 하나의 식(expression)으로 표현한 것. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로 람다식을 익명함수(anonymous function)라고도 한다. 람다식은 메서드의 매개변수로 전달될 수 있고, 메서드의 결과로 반환될 수 있다. 즉, 메서드를 변수처럼 다루는 것이 가능하다. 함수와 메서드의 차이 근본적으로 동일하다. 함수는 수학에서 따온 일반적 용어,..
Java Annotation
Java Annotation (애노테이션, 주석) Annotation이란 애노테이션은 소스코드에 붙여서 특별한 의미를 부여하는 기능이다. 주석(comment)처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공할 수 있다. 다음은 모든 Annotation의 조상인 Annotation인터페이스의 소스코드의 일부이다. package java.lang.annotation; /** * The common interface extended by all annotation interfaces. Note that an * interface that manually extends this one does not define * an annotation interface. Also not..
Java Generics
Java Generics 1. 제네릭스(Generics) 지네릭스는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능 데이터 타입(data type)을 일반화(generalize)하는 것을 의미한다 컴파일 시 타입을 체크해 주는 기능(compile-time type check) - JDK1.5에서 도입 제네릭의 장점 타입 안전성을 제공한다. 타입 체크와 형 변환을 생략할 수 있으므로 코드가 간결해진다. 객체의 타입 안전성을 높이고 형 변환의 번거로움을 줄여준다 - 타입 안정성, 유연성 향상 제네릭 타입은 클래스와 메서드에 선언할 수 있다. class Box { // 지네릭 타입 T를 선언. T는 타입변수 T item; void setItem(T item) { t..
Kotlin List Validation - 리스트 타입 파라미터 검증
코틀린 + Spring Boot 환경에서 Request 를 검증할 때, String 타입의 List를 Null과 빈 값을 허용하지 않기 위한 @NotBlank 어노테이션으로는, List 타입의 필드를 검증할 수 없다. 자바에서는 다음처럼 사용할 수 있지만 코틀린에서는 사용할 수 없다. public class Request { private List inputs; } @field:NotBlack 와 @get:NotBlank 둘 다 사용할 수 없다. 필드나 getter에 걸고 싶기때문에 field:를 명시해줘야 하지만, 이 방법이 통하지 않는다. 해결하기 위해서 사용자 지정 validation annotation을 만들어야 한다. @NotBlank List Elements Custom Validation A..
Java Collection Framework (컬렉션 프레임워크)
컬렉션 : ‘데이터 그룹을 다루고 표현하기 위한 단일화된 구조’ - Java API문서 JDK1.2 이전까지는 Vector, Hashtable, Properties와 같은 컬렉션 클래스들을 각자의 방식으로 처리 데이터를 저장하는 클래스들을 표준화한 설계 - 컬렉션 프레임워크 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있어 편리하고 재사용성이 높은 코드를 제공한다. 컬렉션 프레임웍은 컬렉션 데이터 그룹을 크게 List, Set, Map으로 나눠 3개의 인터페이스를 정의하였다. 그리고 List와 Set의 공통된 부분으로 Collection 인터페이스를 추가로 정의하였다. 인터페이스 List와 Set을 구현한 컬렉션 클래스들은 서로 많은 공통부분이 있어서, 공통된 부분을 다시 뽑아 Coll..
Custom Bean Validation (Custom Validation)
Spring MVC Custom Validation 사용 가능한 constraint 어노테이션이 제공하는 제약 조건 외에 필요한 경우, 직접 만들어서 사용할 수 있다. 임의의 제약(Constraint)과 검증자(Validator)를 구현하여 사용하면 된다. CustomValidation을 위한 Annotation을 생성한다. @Documented @Constraint(validatedBy = ContactNumberValidator.class) @Target( { ElementType.METHOD, ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface ContactNumberConstraint { String message(..