전체 글455 [DB] 두 개 컬럼을 인덱스로 묶고 그 중 하나로만 쿼리를 하면? 옛날부터 궁금한게 한 가지 있었다. 예를 들어, 한 테이블의 col1, col2 칼럼에 동시에 인덱스를 걸어놓았다. 이 떄 인덱스는 따로따로가 아니라 동시에 걸어놓는다. 무슨 말이냐 하면, 위 사진처럼 하나의 인덱스당 하나의 컬럼을 거는 것이 아니라, 아래의 사진처럼 하나의 인덱스에 두 개의 컬럼을 묶어놓는 식이다. 그리고 col2 칼럼을 기준으로 CRUD 쿼리를 실행시키면 과연 "Index가 정상적으로 작동할까?" 궁금한 건 못참으니, 한 번 테스트를 해볼까 한다. 참고로 MariaDB 11.2.2 를 사용했다. 테이블, 프로시저 생성 및 초기 데이터 입력 우선 테이블을 생성한다. 각 테이블은 동일하게 9개의 INT 컬럼으로 구성되어 있으며, 서로 다른 인덱스를 설정해 다섯 개의 테이블을 생성했다. 인.. 2024. 1. 16. ON DELETE(UPDATE) 옵션 프로젝트 진행 전 프로젝트 세팅 과정에서 초기 테이블 생성용 schema.sql 을 작성하고 있었다. 테이블 CREATE 쿼리를 작성하며 외래키를 설정하고 요구사항에 따라 ON DELETE, ON UPDATE 옵션을 설정하는데 문득 의문이 들었다. "나 이게 뭔지 제대로 알고는 쓰나?" 물론 얼추 알기는 안다. 하지만 누군가 "이 옵션이 무슨 옵션이야" 라고 물었을 때 아무 고민 없이 나올 정도로 확실하게 알지는 못한다. 그래서 잠시 반성의 시간을 가졌고, 개념을 확실하게 공부해볼까 한다. 외래 키 (FK, Foreign Key) 외래 키는 데이터베이스 관리 시스템에서 두 테이블 간의 관계를 정의하는 데 사용되는 키이다. 한 테이블의 컬럼이 다른 테이블의 기본 키를 참조하는 것을 의미한다. 주로 참조 무.. 2024. 1. 10. [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. [JAVA] 금고털이 https://softeer.ai/practice/6288 Softeer - 현대자동차그룹 SW인재확보플랫폼 루팡은 배낭을 하나 메고 은행금고에 들어왔다. 금고 안에는 값비싼 금, 은, 백금 등의 귀금속 덩어리가 잔뜩 들어있다. 배낭은 W ㎏까지 담을 수 있다. 각 금속의 무게와 무게당 가격이 주어졌을 softeer.ai 언어별 시간/메모리 JavaScript 3초 256MB C 1초 256MB C++ 1초 256MB Java 2초 256MB Python 3초 256MB C# 2초 256MB Kotlin 2초 256MB Go 2초 256MB Swift 2초 256MB 루팡은 배낭을 하나 메고 은행금고에 들어왔다. 금고 안에는 값비싼 금, 은, 백금 등의 귀금속 덩어리가 잔뜩 들어있다. 배낭은 W ㎏까지 .. 2023. 11. 20. [JAVA] 강의실 배정 https://softeer.ai/practice/6291 Softeer - 현대자동차그룹 SW인재확보플랫폼 김교수는 강의실 1개에 최대한 많은 강의를 배정하려고 한다. 배정된 강의는 서로 겹치지 않아야 하며 수업시간의 길이와 상관없이 최대한 강의를 많이 배정하라. 단, 두 강의의 시작시간과 종 softeer.ai 언어별 시간/메모리 언어시간메모리 JavaScript 5초 256MB C 1초 256MB C++ 1초 256MB Java 5초 256MB Python 5초 256MB C# 2초 256MB Kotlin 2초 256MB Go 2초 256MB Swift 2초 256MB 김교수는 강의실 1개에 최대한 많은 강의를 배정하려고 한다. 배정된 강의는 서로 겹치지 않아야 하며 수업시간의 길이와 상관없이 최대.. 2023. 11. 19. [JAVA] 성적 평균 https://softeer.ai/practice/6294 Softeer - 현대자동차그룹 SW인재확보플랫폼 N명의 학생들의 성적이 학번순서대로 주어졌다. 학번 구간 [A, B]가 주어졌을 때 이 학생들 성적의 평균을 구하는 프로그램을 작성하라. softeer.ai 언어시간메모리 JavaScript 2초 256MB C 1초 256MB C++ 1초 256MB Java 2초 256MB Python 2초 256MB C# 2초 256MB Kotlin 2초 256MB Go 2초 256MB Swift 2초 256MB N명의 학생들의 성적이 학번순서대로 주어졌다. 학번 구간 [A, B]가 주어졌을 때 이 학생들 성적의 평균을 구하는 프로그램을 작성하라. 제약조건 1 ≤ N ≤ 106 인 정수 1 ≤ K ≤ 104 인.. 2023. 11. 19. Spring MVC vs Spring Webflux 빅데이터를 다루는 데이터 허브 시스템을 개발했다. 물론 굳이 따지자면 개발한 건 아니고, 과거의 누군가 만들어놓은 시스템을 가져와 고객의 입맛에 맞게 기능을 추가 및 수정하고 잡다한 에러를 수정했다. 어쨌든 이 시스템을 고치면서 한 가지 의문점이 들었다. "이거 왜 Webflux가 아니라 MVC로 개발했지?" 빅데이터를 다루는 시스템이다보니, 여러 데이터 소스에서 데이터가 유입된다. 물론 사업 관련이라 자세한 이야기를 기재할 수 없지만 데이터 소스가 그렇게 많지 않다는 고객의 요구사항에서는 크게 상관 없는 부분이긴 하다. 하지만 그래도 명색에 "빅데이터를 다루는 시스템"인데 수많은 데이터 소스에서 데이터가 들어올 수 있는 것을 고려하면 당장은 아니더라도 추후 Webflux로 재개발하는 것이 맞을 것 같다.. 2023. 10. 30. 동시성 제어 옛날에 면접을 보던 중 이런 질문을 받은 적이 있다. "동시에 한 칼럼에 두 명이 접근할 때 동시성 제어를 어떻게 수행하세요?" 물론 면접관님께서는 조금 더 구체적인 예시로 질문을 주셨으나, 어찌됐던 질문 속의 속뜻은 위와 같았다. 그런데 그 당시 나는 아무런 대답을 하지 못했었다. 동시성 제어가 중요한 건 알고 있었지만, 굳이 그걸 실제로 구현해본 적은 없었기 때문이다. 그러다 최근 프로젝트를 진행하며 개발 완료된 모듈에 대한 부하 테스트를 수행하는데, 동시성 제어가 제대로 되어있지 않아 데이터가 제대로 갱신되지 않는 것을 발견했다. 이 상황을 면접 전에 겪었더라면 위 질문에 답변을 할 수 있지 않았을까 하는 아쉬움이 남지만, 어찌됐든 지난 일은 지난 일이니 혹시 모를 다음 면접에 대비하고 또 실무에서.. 2023. 10. 16. 이전 1 2 3 4 5 6 7 ··· 38 다음