전체 글 51

[Spring] Spring Data JPA OSIV와 지연 로딩

개요 Todo 어플리케이션에서 마감 시간 1시간 전인 Todo에 대해 사용자에게 알림을 발송하는 기능을 구현 했습니다. 매 분 0초 마다 스케줄러가 데이터베이스에서 1시간 뒤 종료되는 Todo를 조회하도록 했고, 반환된 Todo의 사용자에게 SSE 알림을 발송하도록 했습니다.   그런데 Controller에서 응답을 위해 Todo 엔티티를 DTO로 변환하는 과정에서 문제가 발생했습니다. 문제 발생 원인은 다음과 같습니다. OSIV 설정을 false로 지정했다.Todo에서 User 매핑을 설정할 때 fetchType.LAZY를 적용했다.@Transactional 범위를 넘어가는 Controller에서 Todo가 참조하는 User Proxy 객체에 접근 하니 LazyInitializationException..

개발/Spring 2024.06.11

[BOJ] 백준 10799번 쇠막대기 - JAVA 자바 풀이

접근법여는 괄호 '(' 일 때는 막대나 레이저 상관 없이 스택에 push 합니다.닫는 괄호 ')' 일 때 두 가지 경우의 수가 있습니다. 레이저 또는 막대의 끝을 나타낼 수 있습니다.레이저라면 현재 스택 사이즈 (아직 끝나지 않은 막대의 수)를 더합니다.막대의 끝이라면 잘린 막대가 하나 늘어난 것이므로 1을 더합니다. (아래 그림에서 빨간색으로 표시) Java 코드import java.io.*;import java.util.*;class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ..

[Java] 자바 배열 원소를 이어 붙여서 출력하는 4가지 방법

개요 BOJ와 같은 알고리즘 문제 풀이를 하다 보면 위와 같이 일정한 패턴에 맞춰 배열 원소들을 출력해야 할 때가 있습니다. 자바에서 배열에 담긴 원소들을 형태에 맞춰 출력하는 방법 4가지를 알아보겠습니다. 1. for 문 + StringBuilderString[] arr = {"a", "b", "c", "d", "e"};StringBuilder sb = new StringBuilder();for(String str : arr) sb.append(str).append(", ");System.out.println(sb);a, b, c, d, e, 각 배열 원소를 순회하며 StringBuilder의 append를 호출해 합칠 수 있습니다. 각 원소 사이 구분자가 필요할 경우, append(구분자)를 한..

개발/Java 2024.05.31

[디자인 패턴] Adapter 패턴 구성 요소 및 Spring Security 사례

개요 스프링 시큐리티 6.x 버전 출시 이후로 더이상 사용되지 않는 deprecated된 클래스들이 생겨났습니다. 그에 따라 기존 프로젝트에 적용했던 코드들은 직접적으로 활용하지 않을 것이 권장되었습니다. Spring Security 측이 제공한 해결책 코드에 어댑터 패턴이 적용됨을 발견했고, 해당 코드로 변경하며 공부한 내용을 정리하겠습니다. 1. 어댑터 패턴 어댑터 패턴이란 클라이언트가 호출하는 인터페이스는 정해져 있지만, 실제로 활용할 코드의 인터페이스가 일치하지 않을 때 활용하는 패턴을 말합니다. 클라이언트가 호출할 API와 무관하게 기존의 클래스를 변경하지 않고도 재활용할 수 있도록 하기 때문입니다. 이미 구현이 완료된 클래스를 재사용하고 싶은데 클라이언트가 호출할 API가 클래스의 API와 다..

개발/유지보수 2024.05.30

[Java] Map을 순회하는 3가지 방법

1. entrySet() + IteratorMap은 Collection 인터페이스를 상속하지 않았기 때문에 Iterator를 갖지 않습니다.따라서 entrySet() 메서드 호출을 통해 Collection 인터페이스를 상속한 Set을 리턴한 후 Iterator로 순회하면 됩니다.Map map = new HashMap();map.put(1, "1번째 값");map.put(2, "2번째 값");Iterator> it = map.entrySet().iterator();while(it.hasNext()) { Map.Entry entry = it.next(); System.out.println("Key: " + entry.getKey()); System.out.println("Value: " + ..

개발/Java 2024.05.28

[MySQL] 한글 데이터 ? 물음표 깨짐 해결 방법

개요 MySQL 테이블 데이터를 SELECT 했더니 한글 데이터가 ? 물음표로 출력되는 문제가 발생했습니다. 한글 깨짐 현상을 어떻게 해결할 수 있는지 알아보겠습니다. 문제 원인 우선 저는 AWS RDS에 MySQL 서버를 설치해 사용 중입니다. RDS와 동일한 VPC에 위치한 EC2의 Springboot 애플리케이션 API로 데이터를 요청했을 때는 한글이 잘 출력되었습니다.  반면 로컬 컴퓨터에서 Docker로 MySQL 컨테이너를 띄워 RDS에 접속한 상황에서는 한글 데이터가 깨졌습니다. 이를 통해 MySQL 컨테이너의 인코딩 설정이 문제가 있을 것이라 판단했습니다. SHOW variables LIKE 'character%';  위 명령어를 작성해 확인 결과 character_set_results와 ..

[Java] 자바 Optional 올바른 사용법

개요 Spring Data JPA를 활용해 CRUD 연산을 해보신 분이라면 findById 등의 api가 Optional를 반환함을 아실 겁니다. 이 포스팅에서는 Optional은 무엇인지, 왜 사용하는지, 어떻게 사용하는지 알아보겠습니다. Optional 이란  Optional은 메서드 반환 값으로 사용합니다. "No Result" 결과 없음이라는 값을 표현해야 될 때, 또는 null 반환 시 NullPointException을 야기할 때 사용합니다. // 1. Person 객체를 직접적으로 참조Person p1 = new Person();Person p2 = null;System.out.println(p1.toString());System.out.println(p2.toString()); // NPE..

개발/Java 2024.05.23

[Java] 자바 String 문자열, char 문자를 int 정수로 변환하기

개요 자바에서 숫자로 주어진 String 문자열 또는 char 문자 한 개를 어떻게 int 정수형으로 변환하는지 알아보겠습니다. 또한 Character 클래스의 getNumericValue 메서드와 digit 메서드를 사용할 때 주의점을 알아보겠습니다. String 문자열을 int 정수로 변환하기Integer 클래스의 parseInt(String s) 메서드를 사용합니다.Integer 클래스의 valueOf(String s) 메서드를 사용합니다. char 문자를 int 정수로 변환하기char 문자에서 '0' 을 뺍니다.Character 클래스의 getNumericValue(char ch) 메서드를 사용합니다. Character getNumericValue vs. digit getNumericValue 메..

개발/Java 2024.05.21

[Java] 자바 객체 배열, 리스트 정렬하기 - Comparable vs. Comparator

🚩목차개요 자바 객체 배열 또는 리스트를 정렬하는 세가지 방법을 알아보겠습니다. 예제에서는 int형 멤버변수 x, y를 갖는 Pair 클래스를 예로 들겠습니다. Pair의 정렬 기준으로 a가 작은 객체가 먼저, a가 같다면 b가 작은 객체가 먼저 오도록 하겠습니다.public class Pair { int x; int y; public Pair(int x, int y) { this.x = x; this.y = y; }} Comparable 인터페이스 구현 compareTo 메서드는 this 객체와 other(비교 대상) 객체 중 this가 other 보다 먼저와야 한다면 -1을, this가 other 보다 나중에 와야 한다면 1을, 정렬 우위가 동일하다면..

개발/Java 2024.05.19