본문 바로가기

전체 글447

[JAVA Spring] Thread에 시간제한(Timtout) 걸기 저번 프로젝트를 진행하던 중 한 가지 문제사항에 직면했다. 우선 로직은 아래와 같다.사용자가 데이터를 업로드한다.프로그램은 데이터를 받아 큐에 임시저장한 후 사용자에게 업로드 완료 알림을 보낸다.스케줄러가 동작하며 주기적으로 큐에서 데이터를 빼 스레드에 할당해 비즈니스 로직을 실행시킨다. 이 때 문제사항이 생겼다.사용자가 데이터를 업로드할 때, 업로드된 데이터가 너무 큰 경우이다. 너무 큰 데이터를 업로드했을 때 시간이 오래 소요되는 것은 당연한 일이다. 하지만 지나치게 오랜 시간이 소요되면 어찌됐던 문제가 발생할 수 있다. 게다가 가장 중요한 문제는 위에서 사용자가 업로드한다는 데이터는 파일(엑셀 혹은 csv)인데, 엑셀의 경우 poi 라이브러리를 이용해 구현했다. 하지만 너무 큰 엑셀 파일이 업로드되.. 2024. 5. 17.
Checked Exception과 Unchecked Exception 진짜진짜진짜진짜 간단한건데.. 까먹고 살았다가 오늘 이를 다시금 알게 된 계기가 있어 까먹지 않고자 다시 한 번 공부를 하고, 이를 블로그에 기재해볼까 한다. 프로그래밍을 하다보면 예외처리는 선택이 아닌 필수이다. 그래야만 사용자의 요청에 대한 예외가 발생했을 경우 어떠한 상황으로 인해 예외가 발생했는 지 사용자에게 return할 수 있다.그런 거 없이 500 Internal Exception만 Return하는 코드를 본 적이 있는데, 내가 사용자였다면 두 번 다시 사용하지 않을 것 같다. 그리고 예외인 Exception은 크게 두 가지로 구분된다.Checked ExceptionUnchecked Exception두 Exception의 차이점은 간단하다. 바로 try, catch로 감싸는 예외처리문이 강제.. 2024. 5. 8.
Spring Validation 프로젝트가 끝나고 종료 보고까지 잠시 할 게 없어서 인터넷을 뒤적거리며 이런 저런 개발 자료를 보던 중 처음 보는 것을 발견했다. 지금까지 Controller에서 사용자 입력을 받으면 코드 내에서 해당 입력에 대한 검증을 수행했었다. 이것이 당연하다고 생각하고 있었기 때문이다. 하지만 간단한 검증 작업은 굳이 수기로 하지 않아도 됐었다. 그냥 Spring Validation을 사용하면 알아서 사전에 설정한 검증을 수행해주는 것이었다..!!!처음 알았다..!!! 사실 입력값 검증이라는 것이 간단한 것만 하는 것이 아니기에, 이러한 라이브러리를 알게 되었어도 이를 자주 사용할지는 의문이다. 하지만 이는 단지 내 사고가 편협한 것일 수도 있고, 또한 어떤 지식이던 알아두면 좋다는 신념 하에 한 번 공부를 해볼.. 2024. 5. 7.
[JAVA/BFS] 숫자 변환하기 https://school.programmers.co.kr/learn/courses/30/lessons/154538?language=java# 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr   해결 포인트최단 거리를 찾는 문제이므로 DFS 보다는 BFS가 적합하다.제시된 대로 x에 연산을 할 경우 시간 초과가 나므로, y에 역으로 연산을 하는 것이 해결책이다. import java.util.LinkedList;import java.util.Queue;class Solution { // BFS에 탑재하기 위한 임시 클래스 class TmpNu.. 2024. 5. 7.
[JAVA/DFS/MIN_HEAP] 단지번호붙이기_2667 https://www.acmicpc.net/problem/2667단지번호붙이기 성공 시간 제한메모리 제한제출정답맞힌 사람정답 비율1 초128 MB185829831635295142.656%문제과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. 는 을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.입력첫 번째 줄에는 지도의 크기 N(정사각형.. 2024. 5. 3.
[JAVA/BFS] 바이러스_2606 https://www.acmicpc.net/problem/2606 바이러스 성공 시간 제한메모리 제한제출정답맞힌 사람정답 비율1 초128 MB176210823825506045.918%문제신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.예를 들어 7대의 컴퓨터가 과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는.. 2024. 5. 3.
Hive와 HDFS Hive는 HDFS에 저장된 파일, 디렉토리 구조에 대한 메타 데이터를 가지고 이를 RDB처럼 테이블로 제공하고, SQL을 활용할 수 있는 툴을 제공한다. 이 말은 무엇을 의미할까? 한 마디로 Hive의 데이터 중 메타 데이터와 HDFS에 저장된 데이터가 별도라는 이야기이다. 메타 데이터는 항상 HIVE가 관리한다. 그렇다면 HDFS에 저장된 데이터는? HDFS에 저장된 데이터의 관리 주체에 따라 HIVE의 테이블은 두 가지로 나뉠 수 있다.Managed Table : Hive가 HDFS 내의 데이터도 관리한다.External Table : Hive가 HDFS 내의 데이터까지 관리하지는 않는다. Managed Table일반 RDB처럼 CREATE TABLE 쿼리를 사용할 경우 생성되는 테이블이다. 메타 .. 2024. 5. 2.
Key없이 UPSERT PK가 존재한다면, 해당 PK를 기반으로 UPSERT 쿼리를 짤 수 있다. 예를 들어 아래와 같은 테이블이 있다고 해보자.CREATE TABLE IF NOT EXISTS TMP_TABLE ( PK_SEQ SERIAL PRIMARY KEY, USER_ID VARCHAR(100) UNIQUE NOT NULL, USER_NAME VARCHAR(100));  만약 해당 테이블에 대한 UPSERT 쿼리를 짜야한다면 아래와 같이 짤 수 있을 것이다. (MariaDB 기준)INSERT INTO TMP_TABLE(PK_SEQ, USER_ID, USER_NAME)VALUES(1, '123okk2', 'ㅇㅁㅇ')-- 아래가 UPSERT 부분ON DUPLICATE KEY UPDATE USER_ID='123okk2', .. 2024. 4. 29.
@DependsOn을 사용한 Bean 생성 순서 제어 너무너무너무 당연한 말이지만 빈 생성 순서는 중요하다. A빈이 B빈을 멤버 변수로 갖는다면 B빈이 먼저 선언되고, A빈이 후에 선언되어야 하는 건 당연한 일이다. 그런데 이번에 프로젝트를 진행하며 예상치 못한 상황을 맞닥뜨렸다. 우선 해당 프로젝트에서는 테이블 생성 등 DB 초기화를 굳이 별도의 쿼리로 입력하고 싶지 않아 schema.sql 파일을 통해 스키마를 사전에 정의해놓도록 설정했다. schema.sql : DB의 스키마를 정의하는 SQL로, 최초 테이블 생성 시 사용됨 data.sql : 초기 데이터 삽입 SQL로, 테이블 생성 후 필요한 초기 데이터를 삽입하는 데 사용됨 그리고 기능 중에는 아래와 같은 기능이 있었다. 간단하게 설명하면 사용자에게 요청을 받으면 해당 요청을 "대기" 상태로 저장.. 2024. 4. 10.
[JAVA] OpenCSV를 사용한 CSV 파일 만들기 이전 포스팅에 이어간다. https://123okk2.tistory.com/509 [JAVA] OpenCSV를 이용한 CSV 파싱 프로젝트 내 요구사항 중에는 아래와 같은 요구사항이 존재했다. 사용자가 엑셀 혹은 csv 파일을 서버에 업로드할 수 있을 것 사용자가 엑셀 혹은 csv 파일을 서버에서 다운로드할 수 있을 것 사 123okk2.tistory.com 이번에는 OpenCSV를 활용한 csv 파일 만들기이다. DB에서 데이터를 가져왔다 가정하고, 해당 데이터를 csv 팡ㄹ로 만들어 사용자에게 파일을 제공하는 코드를 공유하려고 한다. 코드 작성 작성 방법은 별게 없다. 그냥 String[]을 CSVReader.writeNext()의 파라미터로 입력만 해주면 된다. DownloadService.java.. 2024. 4. 1.
[JAVA] OpenCSV를 이용한 CSV 파싱 프로젝트 내 요구사항 중에는 아래와 같은 요구사항이 존재했다. 사용자가 엑셀 혹은 csv 파일을 서버에 업로드할 수 있을 것 사용자가 엑셀 혹은 csv 파일을 서버에서 다운로드할 수 있을 것 사실 위 요구사항이 들어간 프로그램의 개발은 첫 번째가 아니다. 이전에 비슷하지만 다른 프로그램을 개발할 때도 csv 기반 다운로드를 지원하라는 요구사항이 존재했다. 그 당시의 나는 아래와 같이 생각했었다. CSV는 쉼표(,)를 기반으로 데이터가 나누어지니, 그냥 쉼표로 데이터를 구분하면 되겠지? 그런데 이는 틀린 생각이었다. 대표적인 예시로 아래 데이터를 들 수 있을 것 같다. col_1 col_2 col_3 abc data: ["abs","vsad","scasd"] 1 위 데이터를 쉼표(,)로 나누면 각 row는.. 2024. 4. 1.
[JavaScript/HTML] 새 창에서 열기 시 response에 따른 분기 프로젝트 진행 중 파일 다운로드 기능을 만들며, 한 가지 의문이 생겼다. 파일 다운로드 기능의 모든 로직은 성공할 수 없다. 예를 들어 특정 기간 내 데이터를 DB에서 불러와 파일로 생성해 다운로드 하려고 하는데 해당 기간 내에는 적재된 데이터가 존재하지 않을 수도 있다. 이런 경우 그냥 404로 띄우면 될 일이긴 하다. 하지만 굳이 그러고 싶지 않았고, 404 페이지로 넘어가기 전에 모달창으로 왜 다운로드 할 수 없는지 이유를 사용자에게 설명해주고 싶었다. 골머리를 앓았지만 방법은 의외로 쉬웠다. 그냥 fetch 라는 기능을 사용하면 된다. 우선 테스트를 위해 직전 프로젝트에서 사용했던 프로젝트를 불러온다. https://123okk2.tistory.com/507 [JAVA] POI 라이브러리를 사용한.. 2024. 3. 31.