본문 바로가기

실습/리눅스 서버 + 스프링 부트52

@DependsOn을 사용한 Bean 생성 순서 제어 너무너무너무 당연한 말이지만 빈 생성 순서는 중요하다. A빈이 B빈을 멤버 변수로 갖는다면 B빈이 먼저 선언되고, A빈이 후에 선언되어야 하는 건 당연한 일이다. 그런데 이번에 프로젝트를 진행하며 예상치 못한 상황을 맞닥뜨렸다. 우선 해당 프로젝트에서는 테이블 생성 등 DB 초기화를 굳이 별도의 쿼리로 입력하고 싶지 않아 schema.sql 파일을 통해 스키마를 사전에 정의해놓도록 설정했다. schema.sql : DB의 스키마를 정의하는 SQL로, 최초 테이블 생성 시 사용됨 data.sql : 초기 데이터 삽입 SQL로, 테이블 생성 후 필요한 초기 데이터를 삽입하는 데 사용됨 그리고 기능 중에는 아래와 같은 기능이 있었다. 간단하게 설명하면 사용자에게 요청을 받으면 해당 요청을 "대기" 상태로 저장.. 2024. 4. 10.
[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.
[JAVA] POI 라이브러리를 사용한 엑셀 파일 만들기 POI 라이브러리를 사용해 사용자에게 업로드된 엑셀 파일을 읽는 포스팅은 직전 포스팅에서 복기했다. 그렇다면 기존 데이터를 엑셀 파일로 만들어서 다운로드하게 해주는 기능은 어떻게 해야하는 방법도 포스팅 해놓으면 훗날 도움이 될 것 같아 작성한다. 마찬가지로 POI 라이브러리를 사용하며, 프로젝트는 이전 프로젝트를 그대로 사용한다. https://123okk2.tistory.com/506 [JAVA] POI 라이브러리를 사용한 엑셀 파싱 직전 프로젝트 두 번째 복기를 해볼까 한다. 우선 간단하게 설명하자면, 나는 사용자에게 파일을 받아 이를 HTTPFS를 통해 HDFS에 저장하고, 내용을 파싱해서 DB에 저장한느 프로그램을 개발했다. 123okk2.tistory.com 프로젝트 설정 코드 작성에 앞서 디펜.. 2024. 3. 31.
[JAVA] POI 라이브러리를 사용한 엑셀 파싱 직전 프로젝트 두 번째 복기를 해볼까 한다. 우선 간단하게 설명하자면, 나는 사용자에게 파일을 받아 이를 HTTPFS를 통해 HDFS에 저장하고, 내용을 파싱해서 DB에 저장한느 프로그램을 개발했다. 이 때 받은 파일은 총 두 가지 종류로, CSV 파일 혹은 엑셀 파일 (xls, xlsx) 이다. 그래서 이번에는 POI 라이브러리를 통해 엑셀 파일을 파싱하는 코드를 공유해볼까 한다. POI 라이브러리 POI ( Poor Obfuscation Implementation)는 Apache에서 개발한 Java용 라이브러리이로 Microsoft Office 문서 형식(예: Excel, Word, PowerPoint 등)을 생성, 수정 및 읽기 위한 라이브러리이다. 해당 라이브러리를 통해 Java 애플리케이션에서 .. 2024. 3. 30.
[Webflux] Hadoop HTTPFS에 파일 업로드 이번에 또다시 혼자서 개발을 전담하며, Hadoop의 에코 시스템과 통신해서 데이터를 업로드/다운로드 하는 프로그램의 개발을 맡게 되었다. 그 과정에서 여러 가지 새로운 것들을 알아냈고, 언제 다시 사용할 지 모르니 복기 차원에서 블로그 포스팅을 해볼까 한다. 우선 첫 번째는 HTTPFS에 파일을 업로드 하는 것이다. 프로젝트는 아래와 같이 설정되어 있다. Spring Boot 3.2.4 Java 17 HTTPFS HTTPFS는 HDFS과 같은 대용량 데이터 저장 시스템에 HTTP(S) 인터페이스를 제공하는 파일 시스템이다. 쉽게 말하자면, HTTP API를 통해 HDFS에 파일을 업로드/다운로드/조회 할 수 있도록 지원하는 API라고 생각하면 쉽다. 왠만해서는 하둡 설치 시 함께 동봉되어 설치되나, s.. 2024. 3. 30.
[Spring JPA] Dynamic Insert/Update 설정에 큰 신경을 쓰지않고 JPA를 사용해보면 거슬리는 부분이 하나 발견된다. 줄글로 설명을 하기는 뭐하니, 코드를 통해 확인해보자. 우선 아래 쿼리를 이용해 테이블을 생성했다. DROP TABLE IF EXISTS test_tbl; CREATE TABLE test_tbl ( row_id INT PRIMARY KEY, row_data_one VARCHAR(100), row_data_two VARCHAR(100) ); 그리고 위 테이블에 대한 도메인 클래스를 아래와 같이 생성해주었다. TestDomain.java import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import j.. 2023. 12. 19.
[Spring JPA] JPA에서도 PK가 변경될까? 내년 초에 시작될 신규 프로젝트에 대비해서 프로젝트 세팅 및 공부를 하던 도중 한 가지 사실을 알아냈다. 우선 내년 초에 시작될 신규 프로젝트는 Spring Webflux를 사용해사 개발할 예정이다. 그리고 Webflux를 사용하기에, DB 접근도 비동기식으로 접근하고자 R2DBC를 사용할 예정이었다. 그런데 프로젝트 세팅겸 도메인 클래스를 미리 생성하던 중 아래와 같은 이슈가 발생했다. 테이블 중에는 다중 PK값을 가지는 테이블이 존재했는데, 해당 테이블의 도메인을 설정하다보니, R2DBC는 @IdClass를 지원하지 않는다는 이슈를 발견한 것이다. 열심히 구글링도 해보고, 전지전능한 챗지피티에게도 문의해보았다. 하지만 돌아온 답변은 모두 "사용할 수 없음" 이었다. 뭐, 이 이슈는 그냥 jpql을 사.. 2023. 12. 18.
[Spring Webflux] HDFS에 파일 업로드 오늘은 Webflux 모듈에서 HDFS에 파일을 업로드 하는 코드를 작성해보고자 한다. 우선 모듈은 이전의 두 개 포스팅에서 작성한 모듈을 이어서 사용했다. https://123okk2.tistory.com/483 [Spring Webflux] Mybatis를 비동기로 돌리기 다음 프로젝트에서는 Spring Webflux 기반 프로젝트에 MaiaDB와 Hive를 동시에 연동시켜서 진행할 예정이다. 두 개의 DB에 대한 요구사항은 얼추 아래와 같이 구성할 수 있다. 프로그램 실행에 사용되는 123okk2.tistory.com 설정 추가 hdfs와의 연동을 위해 필요한 의존성을 추가한다. 참고로 설치된 하둡이 3.2.3 버전이라 3.2.3 버전의 디펜던시를 채택했다. pom.xml org.apache.had.. 2023. 12. 12.
[Spring Webflux] Mybatis를 비동기로 돌리기 다음 프로젝트에서는 Spring Webflux 기반 프로젝트에 MaiaDB와 Hive를 동시에 연동시켜서 진행할 예정이다. 두 개의 DB에 대한 요구사항은 얼추 아래와 같이 구성할 수 있다. 프로그램 실행에 사용되는 데이터는 MariaDB에 저장한다. 사용자가 입력하는 데이터는 Hive에 저장한다. Hive 테이블 구조는 사용자가 직접 설정하며, 해당 구조는 MariaDB에 저장된다. 즉 Hive에 데이터 입력은 고정된 형식으로만 제공되지 않으며, 동적으로 DDL과 DML 설정이 가능해야 한다. 전체 요구사항을 말할 수 없어 이렇게만 적으면 "무슨 소리지" 싶을 수 있겠지만, 아무튼 그렇다. 위 요구사항 만족을 위해 MariaDB는 일반적인 방법으로 r2dbc를 사용해 해결할 수 있다. 하지만 Hive는.. 2023. 12. 5.
[Spring Webflux] MariaDB CRUD API 지금까지는 대부분의 어플리케이션을 Spring MVC로 개발했다. 하지만 다음 해 진행할 프로젝트에서는 기술회의 중 Spring Reactiive (Webflux)를 사용하기로 결정되었다. Webflux 경험이 전무하지는 않다. 한 번의 프로젝트를 Webflux로 개발한 경험이 있고, 개인적으로 공부를 하기도 했었다. 하지만 MVC처럼 실무에서 다양하게 사용해보지는 못해서 당연히 이해도가 많이 떨어져 활용법을 제대로 알지 못했고, 또 프로젝트를 한 지 한참이 지나 까먹은 내용이 대부분이기에 잠시 시간이 난 틈을 타서 사용방법을 공부해보았다. 이어지는 다음 프로젝트에서 사용할 수 있도록 공부한 내용을 포스팅해놓을까 한다. Spring Webflux 웹플럭스는 비동기, 논블로킹을 지원하는 방식이다. 이미 앞.. 2023. 12. 3.
Spring MVC vs Spring Webflux 빅데이터를 다루는 데이터 허브 시스템을 개발했다. 물론 굳이 따지자면 개발한 건 아니고, 과거의 누군가 만들어놓은 시스템을 가져와 고객의 입맛에 맞게 기능을 추가 및 수정하고 잡다한 에러를 수정했다. 어쨌든 이 시스템을 고치면서 한 가지 의문점이 들었다. "이거 왜 Webflux가 아니라 MVC로 개발했지?" 빅데이터를 다루는 시스템이다보니, 여러 데이터 소스에서 데이터가 유입된다. 물론 사업 관련이라 자세한 이야기를 기재할 수 없지만 데이터 소스가 그렇게 많지 않다는 고객의 요구사항에서는 크게 상관 없는 부분이긴 하다. 하지만 그래도 명색에 "빅데이터를 다루는 시스템"인데 수많은 데이터 소스에서 데이터가 들어올 수 있는 것을 고려하면 당장은 아니더라도 추후 Webflux로 재개발하는 것이 맞을 것 같다.. 2023. 10. 30.