본문 바로가기

실습64

[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.
동시성 제어 옛날에 면접을 보던 중 이런 질문을 받은 적이 있다. "동시에 한 칼럼에 두 명이 접근할 때 동시성 제어를 어떻게 수행하세요?" 물론 면접관님께서는 조금 더 구체적인 예시로 질문을 주셨으나, 어찌됐던 질문 속의 속뜻은 위와 같았다. 그런데 그 당시 나는 아무런 대답을 하지 못했었다. 동시성 제어가 중요한 건 알고 있었지만, 굳이 그걸 실제로 구현해본 적은 없었기 때문이다. 그러다 최근 프로젝트를 진행하며 개발 완료된 모듈에 대한 부하 테스트를 수행하는데, 동시성 제어가 제대로 되어있지 않아 데이터가 제대로 갱신되지 않는 것을 발견했다. 이 상황을 면접 전에 겪었더라면 위 질문에 답변을 할 수 있지 않았을까 하는 아쉬움이 남지만, 어찌됐든 지난 일은 지난 일이니 혹시 모를 다음 면접에 대비하고 또 실무에서.. 2023. 10. 16.
[Apache Server] 리버스 프록시_CentOS, Ubuntu 프로젝트 막바지에 이상한 요구사항이 하나가 전달되었다. 외부에 노출되어야 하는 네 개의 모듈 즉 네 개의 서로 다른 웹사이트가 존재하는데, 외부로 나갈 수 있는 포트는 하나 뿐이니 하나의 포트 안에서 네 개의 모듈을 모두 서빙하라는 요구사항이었다. 처음에는 "이게 무슨 헛소리지..."하면서 당황했었다. 그렇다고 을의 입장에서 "헛소리 하지 말고 포트 네 개 열어주십쇼." 라고 말하기도 뭐했다. 그래서 이를 해결하기 위해 같이 프로젝트를 진행하는 다른 회사의 개발자와 이야기를 하던 중 리버스 프록시로 해결할 수 있을 것 같다는 이야기를 들었다. 그 말을 듣고 옛날에 포트 하나로 두 개의 모듈을 서빙할 때 과장님께서 "리버스 프록시를 활용하라"고 알려주셨던 게 기억이 났다. 때마침 서버 안에 static 파.. 2023. 9. 28.
Spring Batch 조금 옛날 일이긴 한데, 데이터 코어라는 모듈을 개발하던 중 적게는 수 개에서 많게는 수만 개의 데이터를 일괄적으로 전송받아 처리하는 Batch 모듈을 개발한 경험이 있다. 사실 이 때 이름도 이름인지라 개발을 "Spring Batch"로 하려고 했던 적이 있다. Spring Batch에 대한 경험은 없었으나, 그냥 이름이 동일하고 대량의 데이터를 처리하기 적합한 기술이라는 것 정도는 알고 있었기 때문이다. 하지만 실제로는 Spring Batch로는 이를 구현할 수 없었다. 컨트롤러에서 받은 사용자의 입력을 스프링 배치로 선언한 job에 넣어주려고 보니, 도저히 넣을 수 있는 파라미터 설정 방법이 보이지 않았다. 스프링 배치는 애초에 컨트롤러에서 데이터를 받아 이를 처리하는 모듈이 아니라, 그냥 내부에서.. 2023. 7. 19.
OSIV JPA를 사용하다보면, 종종 특수한 상황에서 LAZY LOADING을 사용해야하는 경우가 있다. 한 번에 관계 데이터까지 가져오기에는 데이터가 너무 대용량인 경우 너무 복잡한 관계를 가진 데이터인 경우 자주 사용하지 않는 데이터를 관계로 가진 경우 그런데 이렇게 LAZY LOADING을 채택해서 Domain 클래스를 구성했을 때 종종 발생하는 에러가 있다. 바로 LazyInitializationException 에러이다. 지연 로딩은 객체가 실제로 필요한 시점에 DB에서 데이터를 로딩하는 방식이다. 그런데 위의 에러는 DB에서 데이터를 로딩해서 세션(영속성)이 종료된 후인데, 다시 한 번 DB에 접근해서 필요한 데이터를 불러오려고 해서 발생하는 문제이다. 즉, View에서 데이터를 보여줄 때 이미 DB에.. 2023. 7. 14.
[SPRING JPA] N+1 문제 N+1 문제 연관 관계가 설정된 엔티티 조회 시 조회된 데이터의 갯수(N)만큼 연관관계의 조회 춰리가 추가로 발생해서 데이터를 읽어오는 현상이다. 처음 이 말을 들었을 때 무슨 말인지 알지 못했다. 하지만 아래의 예시를 들면 이해가 편할 것 같다. 우선 아래와 같은 두 개의 테이블이 존재한다고 가정한다. CREATE TABLE IF NOT EXISTS school ( school_name VARCHAR(100) PRIMARY KEY ); CREATE TABLE IF NOT EXISTS student ( stdnt_name VARCHAR(100) PRIMARY KEY, school_name VARCHAR(100) NOT NULL, CONSTRAINT FK_SCHL FOREIGN KEY(school_name.. 2023. 7. 4.
Spring Boot + Mybatis 현재 회사에서 주로 하는 프로젝트는 빅데이터 혹은 사물인터넷 관련이다. 그러다보니 주로 데이터 저장에는 NoSQL을 사용하게 되고 RDB를 사용하면 동적으로 DDL을 생성해서 테이블을 create 하는 방법을 사용하고 있다. (빅데이터나 IoT는 데이터 형식에 따라 동적으로 테이블 구조가 결정되기 때문) 첫 프로젝트에서는 JPA를 사용해 개발을 진행했었다. 그 때 JPA의 편리한 사용법에 매료됐었지만, 아쉽게도 그 이후로는 JPA를 쓸 일이 없었다. 이유라면 위에서 언급했듯, 동적으로 DDL을 생성해서 테이블을 관리하기에 사전에 테이블 구조가 정해져 있어야 하는 JPA는 사용을 할 일이 없었다. 그래서 대신 MyBatis를 주로 사용했고, 오늘은 Spring Boot에서 MyBatis의 사용법을 포스팅 .. 2023. 7. 2.
Spring Boot + JSP 요즘 여러 회사의 채용공고들을 살펴보고 있는데, 느낀 점이 아직은 Spring Boot보다는 Spring Framework가 많이 사용되고, Thymeleaf 보다는 JSP가 많이 사용된다는 점이었다. 그래서 가만히 생각을 해보니, 회사에서 Thymeleaf만 사용하다보니 JSP를 전부 까먹었다는 사실을 알아냈다. 언제 jsp를 사용하게 될 지 모르므로, jsp의 사용법을 간단하게 기재해서 저장해놓고자 한다. JSP Java Server Pages (JSP)는 웹 개발을 위해 사용되는 자바의 기술이다. HTML과 Java를 결합해서 사용할 수 있는데, 서버에서 실행해서 생성된 결과를 html로 사용자에게 전달한다. 동적인 웹 페이지를 만들때 사용된다. JSP를 사용함에 있어 장점과 단점은 아래와 같다. .. 2023. 7. 2.
OAuth2.0 + Spring Boot (Google, Kakao, Naver 연동) 회사 프로젝트에서 API Gateway를 개발하면서 로그인과 토큰 발급을 위해 외부 OAuth에 연동시켰다. 단 이 때 자체 로그인 기능은 배제된 상태로 개발이 진행됐다. 그런데 최근 자체 로그인 기능을 추가하며 앞서 작성했던 코드를 다시 열었는데, 어떻게 작성했는지 기억이 나지 않았다. 역시 사람은 어딘가에 적어놓지 않는다면 까먹는구나 라는 사실을 다시 한 번 깨달았고, 맨날 적어야지.. 하면서 절대 안적어놓는 스스로의 게으름을 반성하고자 Spring Boot에서 OAuth2.0을 연동하는 방법을 적어놓을까 한다. OAuth2.0 OAuth2.0은 인증을 위한 산업 표준 프로토콜이다. 사용자에가 굳이 비밀번호를 공유하지 않고도 사용자 대신 다른 서비스에 접근할 수 있는 권한을 부여하는데 사용된다. OA.. 2023. 7. 1.
application 파일에서 자료구조(list, map) 사용법 개발을 하다보면 시스템 설정 같은 부분은 당연하게도 application.properties (혹은 yml)에서 담당하게 된다. 대부분의 설정은 String, Numeric 형태의 단일 값이지만, 가끔은 list, map 와 같은 형태로 사용을 하게 될 때도 존재했다. 이런 상황에서는 항상 구글링을 통해 해결을 했다. 그리고 그 때마다 언젠가는 블로그에 적어놓고 굳이 찾아다니지 말고 바로 적용해서 써야지... 라는 생각을 했었다. 그렇게 생각만 한지 몇 달이 되어 드디어 해당 포스팅을 작성해서 방법을 저장해놓을까 한다. 포스팅은 application.properties를 기반으로 작성한다. List 우선 List를 사용하는 방법이다. appliction.properties에서는 쉼표(,)를 이용해서 여러.. 2023. 5. 28.