JAVA

A collection of 28 posts
JAVA

[Kotlin] Kotlin으로 Java/Kotlin 모두 사용 가능한 유틸성 라이브러리 만들기

유틸성 라이브러리의 필요성 프로젝트를 진행하다 보면, 공통적으로 필요한 기능들이 정말 많다는 것을 알 수 있다. 그리고 이런 공통의 기능들을 사용하기 좋게 기능들을 모아둔 것을 '유틸성 라이브러리'라고 한다. 아마도 국내에서 많은 개발자들이 쓸법한 유틸성 라이브러리라 하면 스프링이나 전자정부 프레임워크에서 제공하는 유틸성 라이브러리일 것이다. 물론 대부분의 경우 이런 라이브러리를
6 min read
Kotlin

[Kotlin] lateinit 변수의 값이 세팅 되었는지 확인하기

Kotlin과 늦은 초기화 전략 kotlin 언어에서는 변수에 null이 들어오지 않았으면 하지만, 값을 초기에 설정할 수 없는 경우를 대비해 두 가지 '늦은 초기화' 방식을 제공한다. 그 중 하나는 lateinit, 그리고 나머지 하나는 lazy이다. 여기서는 lateinit 변수에 값이 세팅 되었는지 확인하는 방법에 대해 다루어보도록 하겠다. 이 변수, 값이 들어오긴 했나?
3 min read
JAVA

[JAVA] Bouncy Castle로 LEA/ARIA 블록 암호화 하기

C/C++ 예제는 많은데... 예전부터 국산 암호화 기술에 관심은 많았는데, 이상할 정도로 Java나 Kotlin으로 작성된 예제는 그렇게 많지 않았다. 심지어 KISA 공식 홈페이지에서도 LEA 블록 암호화 알고리즘 정도나 암호화 모드별로 샘플 소스코드가 제공되고 있고, ARIA는 엔진 코드만 제공되어 있을 정도로 Java 진영에서는 찬밥 취급이다. 아마도 국내에서는 해당 알고리즘들이 DRM 위주로만
8 min read
JAVA

[JAVA] ResourceBundle로 다국어 메시지 처리

ResourceBundle이란? 프로그램을 만들 때, 다국어 처리(이하 i18n)를 지원해야하는 경우가 있다. i18n은 동일한 내용을 가진 메시지를 지역에 따라 서로 다른 언어로 메시지를 처리하는 것을 말한다. 예를 들어, 한국에서는 안녕하세요!라고 보여주는 메시지를 영어를 쓰는 국가에서는 Hello!로 보여줄 수 있도록 하는 것이 바로 i18n다. Java에서는 ResourceBundle이라는 클래스를 사용해 i18n을
4 min read
JAVA

[JAVA] 현명하게 예외처리하기

예외 처리의 중요성 대부분의 언어에는 예외 처리(혹은 오류 처리)라는 것이 존재한다. 예외 처리는 프로그래밍 시, 아주 중요한 작업이다. 시스템의 문제 여부를 빠르게 확인하고 어떠한 문제인지 파악하는데 도움을 받을 수 있기 때문이다. 또한 어플리케이션이 다시 정상적으로 동작할 수 있도록 도움을 줄 수도 있다. 예외의 종류 JVM 계열 언어(Java,
11 min read
JAVA

IntelliJ properties 한글 깨짐 해결하기

인텔리제이에서 properties 파일을 수정 하려다 아래와 같이 한글이 유니코드 형식으로 보이는 것을 확인했다. 이클립스에서는 위와 같은 현상을 해결하기 위해 플러그인을 설치해줘야 한다. 하지만 인텔리제이는 설정에서 인코딩 설정만 바꿔주면 해결된다. 설정 > 에디터 > 파일 인코딩으로 이동한 다음, 프로퍼티 파일에 대한 디폴트 인코딩을 UTF-8로 변경해주고 명확한 Native에서 ASCII로의 변환 옵션을 활성화
1 min read
JAVA

[JAVA] 자바 null 박살내기

개발자들의 영원한 적, null의 탄생 개발자들에게 프로그래밍 하면서 자신을 가장 괴롭히는 것을 몇 가지 꼽아보라 한다면, 보통 그 리스트에 null처리는 반드시 들어가게 될 것이다. 그만큼 null은 개발자를 괴롭히는 적이며, 그들은 이 null을 처리하기 위해 끝이 없어보이는 힘겨운 싸움을 하게 된다. null은 컴퓨터 과학자인 토니 호어(Tony Hoare)가 알골 W(
10 min read
JAVA

@Transactional 옵션으로 (rollbackFor = Exception.class)를 왜 쓸까?

☝️여기서 설명하는 @Transactional은 org.springframework.transaction.annotation.Transactional이다. javax, jakarta 패키지에 기본 포함된 @Transactional의 경우 동일한 기능을 하기는 하나, 일부 옵션의 이름이 상이할 수 있으니 유의 바란다. 참고로 javax, jakarta에서 rollbackFor와 동일한 옵션은 rollbackOn이다. 그런 글들 자주 봤다 @Transactional 관련 글을 보면 예제로 @Transactional(rollbackFor=Exception.class)를 적어두거나, 선임이
8 min read
JAVA

스프링 부트 3에 Swagger 적용하기

REST API 문서 도입기 최근 REST API 문서 생성을 위해 Swagger 도입을 고려하고 있었다. 그래서 구글링을 통해 Swagger 적용 방법에 대한 글을 찾아보고 그대로 적용해 보았다. 그런데 이게 웬걸? Swagger를 적용하고 접속해본 곳에는 오직 Whitelabel Error Page 만이 반겨줄 뿐이었다. 스택 오버플로우를 찾아도 스프링 부트 버전을 2.5.X으로 낮추라는
5 min read
Spring

Mustache CSRF 적용하기

더 이상의 CSRF disable은 NO! 보통 스프링 시큐리티 설명을 위한 글들을 보면 Config 코드에 다음과 같이 작성된 코드를 많이 볼 수 있다. http.csrf().disable().build(); // 혹은 http.csrf(CsrfConfigurer::disable) 코드만 봐도 알겠지만, 이는 HttpSecurty에서 CSRF 보안을 사용하지 않도록 설정하는 것이다. 물론 예제나 테스트를 위한 프로젝트에서는 꺼도 상관없겠지만, 실제로
2 min read
JAVA

[JAVA] BufferedReader readLine() 메소드가 동작 안할 때

선행 요약 BufferedReader를 통해 읽어들일 문자열 끝에 개행 문자(\n)가 붙었는지 확인하자. 개행 문자가 존재하는지 확인해야 하는 이유는, BufferedReader가 개행 문자를 통해 경계를 구분하기 때문이다. 개행 문자가 존재하지 않으면 여전히 데이터를 수신하고 있는것으로 판단하기 때문에, readLine() 메소드를 사용해도 데이터를 읽어올 수 없다. 소켓 통신이 굴린 거대한 스노우 볼 최근,
4 min read
JAVA

Java에서 Random 클래스를 사용하지 말자

SonarLint에서 수상쩍은 경고가 떴다 SonarLint 혹은 SonarQube를 쓰는 경우, Random 객체를 사용했을 때 다음과 같은 이슈를 본 사람이 있을지도 모른다. "Random" objects should be reused 위의 경고는 Random rand = new Random(); 같이 코드를 작성했을 때 발생한다. 이런 경고가 발생하는 이유는 난수를 발생할 때 사용할 시드를 그때마다 생성시키는 비효율성
5 min read
JAVA

다시, 인터페이스 (feat. 객체지향 언어에 인터페이스가 존재하는 이유)

지난번에 "객체지향 언어에 인터페이스가 존재하는 이유" 라는 글을 쓴 적이 있었다. 하지만 다시 읽어보니 지나치게 난잡 하다는 느낌을 지울수가 없어서, 이 기회에 다시 글을 적어보게 되었다. 객체지향 언어에 인터페이스가 존재하는 이유코드의 결합도가 높으면 생기는 문제 어떤 개발자가 고객으로부터 계정의 패스워드를 암호화 해서 저장을 해야하니, 패스워드를 암호화 하는 기능을
20 min read
JAVA

객체지향 언어에 인터페이스가 존재하는 이유

코드의 결합도가 높으면 생기는 문제 어떤 개발자가 고객으로부터 계정의 패스워드를 암호화 해서 저장을 해야하니, 패스워드를 암호화 하는 기능을 만들어야 한다는 요청을 받았다. 개발자는 금방 암호화 기능을 추가해 고객에게 보여주었다. @Test public void encryptMD5() throws NoSuchAlgorithmException { // 외부에서 입력받은 패스워드 String password = "this is password"; // MD5 알고리즘으로 문자열을 인코딩 한다
15 min read
JAVA

Spring Data JPA 3부터 바뀐 SEQUENCE(시퀀스) 기본키 생성 전략

마이그레이션을 진행합니다... 안되잖아? Spring Boot 3이 공식적으로 배포되기 시작하면서, 이 참에 2.7.X 버전으로 개발중이던 프로젝트를 3.0.0으로 업그레이드 했다. 마이그레이션을 진행 하면서, 하나하나 발생한 문제를 손수 뜯어 고치고 프로젝트를 실행 했더니 이게웬걸! 뜬금없이 JPA 쪽에서 문제가 발생했다. 알고보니 기존의 Spring Data JPA 2에서 Hibernate 5를 사용하다 Spring
3 min read
JAVA

스프링 부트 Kafka 연동하기

개발환경 * OpenJDK 17 * Docker Spring Boot 프로젝트 생성 1. https://start.spring.io 접속. 2. 아래 사진과 같이 설정하고 프로젝트 생성. 프로젝트 불러오기 1. 생성된 프로젝트 압축파일 풀기. 2. 압축이 풀린 폴더를 IDE에서 폴더 열기로 프로젝트를 불러오기. 프로젝트 구조 application.yml 생성 1. src/main/resources 디렉토리에 존재하는 application.properties
4 min read
Spring

스프링을 쓰는 이유

왜 스프링을 쓸까? 국내에서 가장 많이 쓰이는 백엔드 프레임워크는 단연 Spring Framework(이하 스프링)일 것이다. 그런데 왜 스프링을 사용했냐고 물어보면 이 질문에 대해 답할 수 있는 사람은 별로 없다는 것을 깨닫게 될 것이다. 이는 스프링이 제시하는 핵심 가치나 특징을 모르기 때문에 그런 것이다. 그렇다면 위의 질문에 대답할 수 있도록,
6 min read
JAVA

함수와 메소드의 차이

함수랑 메소드가 같은게 아니라고? 내가 JAVA를 주로 하면서 함수와 메소드를 구분해서 썼던 기억은 없었던 것으로 기억한다. 그랬으니 나는 당연히 함수와 메소드의 차이에 대해서도 잘 모르고 대충 뭉뚱그려서 전부 함수라고 불렀었다. 함수와 메소드를 구분 짓는 가장 큰 차이점은 '함수가 단독으로 존재하느냐, 아니면 클래스 내부에 포함되어 있느냐' 로 구별된다. 이제부터
4 min read
JAVA

객체지향 설계의 5가지 원칙

SOLID 원칙? 객체지향 설계를 할 때, SOLID 원칙을 지켜줘야 한다는 얘기는 정보처리기사 공부를 했다면 한번쯤은 들어봤을 것이다. (그리고 자격증을 취득하면 귀신같이 잊어버린다.) SOLID 용어는 다음과 같이 1. 단일 책임 원칙(Single Responsibility) 2. 개방-폐쇄 원칙(Open Closed Principle) 3. 리스코프 치환 원칙(Liskov Substitutuib Principle) 4. 인터페이스 분리 원칙(Interface
6 min read
Gradle

Gradle을 이용해 하나의 클래스 및 함수만 테스트 하기

하나의 클래스 테스트하기 Spring Boot 2 프로젝트를 진행하면서, JUnit 5을 이용해 테스트 주도 개발을 하고 있다. 그러던 중 한 가지 문제에 봉착하게 되었다. 테스트 규모가 커지기 시작하면서 테스트 실행 시, 모든 테스트를 실행하는 데에 부담이 생기기 시작한 것이다. 따라서 테스트 할 때, 클래스 혹은 함수 단위로 테스트를 할 필요가 생긴
7 min read
Gradle

*-plain.jar 빌드되지 않게 하기

Spring Boot 2에 포함된 Gradle(이하 그레이들) 플러그인이 2.5 버전부터 두 개의 jar 파일을 빌드하도록 변경되었다고 한다. 구글링을 해보니, 끝에 -plain이 붙는 jar 파일은 애플리케이션 실행에 필요한 런타임 의존성이 제거된 jar 파일이라고 한다. 런타임 의존성이 제거가 됐기 때문에, 우리가 jar 파일을 실행할 때 쓰는 명령어인 java -jar 로 실행이
2 min read
Gradle

jar 파일 이름 변경해서 빌드하기

스프링 부트 2 프로젝트를 빌드 한다면 보통, Gradle(이하 그레이들)이나 Maven을 이용해 빌드하게 될 것이다. 나 같은 경우에는 그레이들을 사용해서 빌드하고 있는데, 문제는 빌드 결과물인 jar 파일의 이름이 불필요 할 정도로 길다는 점이었다. 일반적으로 프로젝트를 빌드하면, 다음과 같은 규칙으로 jar 파일 명이 결정된다. <프로젝트 명>-<
4 min read
Jenkins

Jenkins로 Spring Boot 2 + Vue 3 프로젝트를 리눅스 서버에 배포하기 (3)

새로운 빌드 Item 생성하기 Jenkins 메인 화면 좌측에 새로운 Item 이라는 버튼을 클릭하자. Item을 식별할 이름을 지정 해준 뒤, Freestyle project를 선택하고 OK 버튼을 클릭한다. 나는 Book Management App 이라는 이름으로 지정해 주었다. 가장 위, 설명에 이 Item이 어떤 것인지 알려주는 문구를 적어주자. (EX. 이 Item은 나의 프로젝트를 빌드하는 Item
10 min read
Jenkins

Jenkins로 Spring Boot 2 + Vue 3 프로젝트를 리눅스 서버에 배포하기 (2)

Jenkins로 프로젝트 자동 배포하기 지난 글에서는 나의 프로젝트를 배포할 서버를 세팅하는 과정에 대해 다루었다. 이번 글에서는 Jenkins를 통해 Spring Boot 2 + Vue 3 프로젝트를 자동 배포하는 방법에 대해 다루도록 하겠다. Jenkins를 사용할 것이기 때문에, 당연히 Jenkins가 배포되어 있는 서버가 필요하다. 만약 Jenkins 서버가 없다면 아래의 글을 참조해 하나 만들도록 하자.
7 min read