문제 설명 제한 사항 입출력 예 입출력 예 설명 풀이(주석 포함)import java.util.*;class Solution { public int solution(String[] friends, String[] gifts) { int friendsLength = friends.length; // 빠르게 친구 찾기 위한 해시맵 생성 HashMap friendsMap = new HashMap(); for(int i = 0; i giftGraph[j][i] || (giftGraph[i][j] == giftGraph[j][i] && giftDegree[i] > giftDegree[j])){ ..
Java
에러 발생java.lang.IllegalStateException: **Duplicate key 'key로 저장하려는 값'** (attempted merging values ~~) 오늘도 만난 에러,, 뜯어봐야 알겠지만 대충 봐도 key 값이 중복되어 발생한 에러다. 에러 원인에러가 발생한 부분을 찾아보니 아래와 같았다. Map memberMap = memberInfoRepository.findByMemberIds(memberIds).stream() .collect(Collectors.toMap(Member::getMemberId, member -> member)); 여기서 Collectors.toMap() 호출 시 중복되는 key 값이 존재하는 것이 에러의 원인이었다. memberId를 ..
새로운 프로젝트 진행 중 만나버린 친구.. 오랜만이다 CORS 에러.. 안녕?.. CORS 에러는 웹 개발자라면 꼭 만날 수 밖에 없는 에러로 명성이 자자하다. CORS란? Cross-Origin Resource Sharing의 줄임말로 웹 브라우저에서 다른 출처의 리소스 공유에 대한 허용/비허용을 다룬 보안 정책이다. 예를 들어, 다른 회사의 API 등 다른 도메인의 API(다른 출처)를 이용하고 싶을 때 CORS 허용 설정이 되어 있어야 성공적으로 API에 접근해 리소스를 공유받을 수 있다. CORS 설정 방법 CORS 에러를 해결하기 위한 여러 방법이 있겠지만 오늘은 직접 서버에서 HTTP 헤더 설정을 통해 다른 출처를 허용하도록 설정하려고 한다. Spring 서버, Node 서버 등 각 서버에 맞..
개발을 하며 MySQL의 Timestamp가 이상하게 조회되는 상황에 맞닥뜨렸다. 발생한 이슈와 원인, 해결한 방법 순서대로 기록해둔다. 이슈 발생 간단하게 정리하면 데이터 조회 시 특정 일자의 하루 동안 저장된 데이터를 조회해야 했고, 이를 위해서 특정 일자의 시작 시간(yyyy-MM-dd 00:00:00)과 끝 시간(yyyy-MM-dd 23:59:59)을 Timestamp 타입으로 만들었다. 예를 들어 일자별 회원가입 현황을 데이터테이블로 산출하려고 한다. 조회 시에는 JPQL을 사용했고, 테스트 용으로 아주 간단하게만 구현해두었다. /** * 일자별 회원가입 현황 * @param * @return */ public List getDailySignUp(Integer start, Integer leng..
Integer ArrayList을 int 배열로 변환하는 방법에 대해 알아보자. 사실 자꾸 까먹어서 기록해둔다. String 타입의 List를 배열로 변환할 때 toArray()를 사용하면 된다. List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); // 1. toArray() - 배열 선언과 동시에 할당 String[] arr = list.toArray(new String[0]); // ["a", "b", "c"] // 2. toArray() - 배열 선언 후 값 할당 String[] arr2 = new String[list.size()]; list.toArray(arr2); // ["a", "b", "c"] 하지만 int형..
오늘은 ORM에 대해 정리해본다. ORM(Object Relational Mapping)이란? 데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 개념을 영속성(Persistence)이라고 한다. Java에서는 데이터의 영속성을 위한 JDBC를 지원해주는데, 이는 매핑 작업을 개발자가 일일히 수행해야 하는 번거로움이 있다. SQL Mapper와 ORM은 JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있도록 기능을 제공해주는 Persistence Framework 종류이다. SQL Mapper SQL Mapper는 Object와 SQL의 필드를 매핑하여 데이터를 객체화 하는 기술이다. 객체와 테이블 간의 관계를 매핑하는 것이..
Java로 개발을 시작하기도 전부터 'JVM에 대해서는 잘 알고 있어야 한다'는 이야기를 들었었다. 특정 운영체제 종속적이지 않고, 직접 메모리를 관리해주는 등 JVM이 중요한 이유도 함께 들었던 기억이 있다. 오늘 드디어 이 JVM에 대해 간단히 정리를 해본다. JVM(Java Virtual Machine) JVM은 Java Virtual Machine, 즉 자바 가상 머신의 약자로 자바 프로그램 런타임 환경을 제공하는 소프트웨어이다. 자바 애플리케이션을 클래스 로더를 통해 읽어 들여, 자바 API와 함께 실행하는 역할을 한다. Java와 OS 사이에서 중개자 역할을 수행해 Java가 OS에 구애받지 않고 실행되도록 한다. 또한, Garbage Collection, 즉 프로그램 메모리 관리도 하며 최적..
자료 구조 중 트리가 있다. 트리 구조를 순회하는 방법에는 세 가지 방법이 있다. 전위 순회(Pre-order) 중위 순회(In-order) 후위 순회(Post-order) 이러한 순회 방법은 트리 내의 모든 노드를 방문하는 기초적인 방법들로서, 트리 구조를 다루는데 중요한 역할을 한다. 순회 방법은 트리의 형태와 원하는 결과에 따라 다르게 선택될 수 있다. 그렇다면 이 3가지 트리 순회에 대해 알아보자. 전위순회(Pre-order) 전위순회는 다음 순서로 노드를 순회한다. Root - Left - Right 상단의 트리를 전위순회로 순회한다면 다음과 같은 순서로 노드를 순회할 것이다. 전위 순회한 결과 : ABDCEFG 중위순회(In-order) 중위순회는 다음 순서로 노드를 순회한다. Left - R..
Kafka에서 이벤트를 소비/생성해야 하는 Spring Boot 기반 애플리케이션이 있을 경우 2가지 라이브러리 중 선택해 사용할 수 있다. Kafka Clients Spring Kafka 둘 중 어떤 라이브러리를 사용할 것인가에 대한 스택오버플로우의 한 게시물에서는 이렇게 설명하고 있다. Spring Kafka는 핵심 의존성 주입으로 대표되는 Spring 개념을 적용하는데 도움된다. 이것은 메시지를 보내는데 사용되는 ‘템플릿’을 높은 수준의 추상화로 제공한다. 또한, @KafkaListener 어노테이션과 ‘Listener Container’를 사용해 메시지 기반의 POJO(Message-driven POJOs)를 지원한다. 두 가지 라이브러리에 대해 좀 더 자세히 알아보자. Kafka Clients ..
특정 구간의 코드 실행 시간을 알고 싶은 경우가 있다. 대부분 개발 중 어느 부분이 느린지 알아내야하는.. 경우다. 이 때 사용할 수 있는 Java 함수 하나 알아보자. Java에서 특정 구간의 코드 실행 시간이 얼마나 소요되는지 알고 싶을 때는 System.currentTimeMillis() 함수를 사용하면 된다. 이 함수는 현재 시간을 받아오는 System 함수로, 실행 시간을 측정하고 싶은 코드의 시작 구간과 종료 구간에 각각 해당 함수를 사용해 시간을 받아오고, 두 시간 사이의 차이를 계산하면 된다. 함수명에서 알 수 있듯이 ms 단위의 시간 차를 결과값으로 얻을 수 있다. 만약 값을 초(s) 단위로 변환하고 싶다면 System.currentTimeMillis()/1000 을 사용하면 되고, 초(..