본문 바로가기

전체 글455

[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.
[JAVA/DFS] 금민수의 개수_1527 https://www.acmicpc.net/problem/1527 1527번: 금민수의 개수 첫째 줄에 A와 B가 주어진다. A는 1보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다. B는 A보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다. www.acmicpc.net 금민수의 개수 성공 시간 제한메모리 제한제출정답맞힌 사람정답 비율 2 초 128 MB 3702 1424 1190 39.960% 문제 은민이는 4와 7을 좋아하고, 나머지 숫자는 싫어한다. 금민수는 어떤 수가 4와 7로만 이루어진 수를 말한다. A와 B가 주어졌을 때, A보다 크거나 같고, B보다 작거나 같은 자연수 중에 금민수인 것의 개수를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 A와 .. 2023. 7. 3.
Spring Boot + Mybatis 현재 회사에서 주로 하는 프로젝트는 빅데이터 혹은 사물인터넷 관련이다. 그러다보니 주로 데이터 저장에는 NoSQL을 사용하게 되고 RDB를 사용하면 동적으로 DDL을 생성해서 테이블을 create 하는 방법을 사용하고 있다. (빅데이터나 IoT는 데이터 형식에 따라 동적으로 테이블 구조가 결정되기 때문) 첫 프로젝트에서는 JPA를 사용해 개발을 진행했었다. 그 때 JPA의 편리한 사용법에 매료됐었지만, 아쉽게도 그 이후로는 JPA를 쓸 일이 없었다. 이유라면 위에서 언급했듯, 동적으로 DDL을 생성해서 테이블을 관리하기에 사전에 테이블 구조가 정해져 있어야 하는 JPA는 사용을 할 일이 없었다. 그래서 대신 MyBatis를 주로 사용했고, 오늘은 Spring Boot에서 MyBatis의 사용법을 포스팅 .. 2023. 7. 2.
[JAVA/DFS] 1으로 나누기_1463 https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 1로 만들기 성공 시간 제한메모리 제한제출정답맞힌 사람정답 비율 0.15 초 (하단 참고) 128 MB 262055 87826 56089 32.605% 문제 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입력 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 .. 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.
[JAVA/MIN_HEAP] 막대기_1094 https://www.acmicpc.net/problem/1094 1094번: 막대기지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대www.acmicpc.net 막대기 성공 시간 제한메모리 제한제출정답맞힌 사람정답 비율2 초128 MB26731197301666075.072%문제지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다.막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는.. 2023. 7. 1.
OAuth2.0 + Spring Boot (Google, Kakao, Naver 연동) 회사 프로젝트에서 API Gateway를 개발하면서 로그인과 토큰 발급을 위해 외부 OAuth에 연동시켰다. 단 이 때 자체 로그인 기능은 배제된 상태로 개발이 진행됐다. 그런데 최근 자체 로그인 기능을 추가하며 앞서 작성했던 코드를 다시 열었는데, 어떻게 작성했는지 기억이 나지 않았다. 역시 사람은 어딘가에 적어놓지 않는다면 까먹는구나 라는 사실을 다시 한 번 깨달았고, 맨날 적어야지.. 하면서 절대 안적어놓는 스스로의 게으름을 반성하고자 Spring Boot에서 OAuth2.0을 연동하는 방법을 적어놓을까 한다. OAuth2.0 OAuth2.0은 인증을 위한 산업 표준 프로토콜이다. 사용자에가 굳이 비밀번호를 공유하지 않고도 사용자 대신 다른 서비스에 접근할 수 있는 권한을 부여하는데 사용된다. OA.. 2023. 7. 1.
내부망에서 apt 사용 프로그램 개발 후 고객사 내부망에 프로그램을 설치하기 위해서는 JAVA 등의 몇몇 인프라가 필요하다. 하지만 말 그대로 내부망은 인터넷이 되지 않는 환경이고, 이에 필요한 인프라를 오프라인으로 설치할 수 있는 준비를 해야했다. CentOS의 경우 local repository를 만드는 방법을 통해 yum을 오프라인 환경에서 사용할 수 있다. 방법은 아래 링크에 적어놓았다. https://123okk2.tistory.com/404 내부망에서 yum 사용 개발이 완료된 후에는 클라이언트의 서버에 개발 완료된 프로그램을 배포해주어야 한다. 하지만 당연하게도 프로그램은 단일로 동작하지 않고, Java, DB등 여러 인프라가 필요하다. 만약 서버가 123okk2.tistory.com 하지만 Ubuntu의 경우에는.. 2023. 6. 4.
[PostgreSQL] 시간 쿼리 가장 최근 프로젝트에서 RDB는 PostgreSQL만 사용했다. 그러다보니 몰랐던 사실을 몇 가지 알게 되었는데, 시간 관련 쿼리가 대표적인 예시였다. 요즘들어 PostgreSQL을 사용하는 프로젝트들이 많은데, 적어놓지 않으면 까먹을 것이 분명해서 조금이라도 오래 기억하고, 추후 필요해질 경우 곧바로 활용할 수 있도록 저장을 해놓고자 한다. 우선 다음 구조의 간단한 테이블이 있다고 가정한다. 간단하게 name, reg_date로 이루어진 테이블이다. 해당 테이블에는 아래와 같은 데이터가 입력되어있다. (참고로 오늘 날짜는 2023-05-29이다.) SELECT에서 월, 연, 일, 요일 등 특정 시간 정보만 뽑아내기 가장 먼저 저장할 쿼리는 reg_date (timestamp)에서 연, 월, 일, 요일,.. 2023. 5. 29.
자동 재실행 스크립트 만들기 개발 완료된 프로그램을 설치 및 배포하는 과정에서 문득 굼긍증이 들었다. "이거... 에러나서 꺼지면 어떻게 하지?" 굳이 변명을 해보자면 지금까지 설치 및 배포를 진행해본 경험은 몇 차례 있었다. 하지만 지금까지는 부사수로써 사수를 보조하는 역할이 대부분이었다. 즉, 주도적으로 설치 및 배포를 해본 적이 없어 그냥 단순히 프로그램을 설치하고 배포하는 것만 생각했지 그 외의 부분까지 고려하는 시각을 가지지 못했었다. 늘 그 외의 부분은 사수이신 과장님께서 해주셨으니까... 그리고 내가 담당하고 개발한 프로그램들은 대부분 도커화 해서 개발했기 때문에, 에러가 나서 꺼질 경우 재실행 되는 것은 당연한 일이었다. 그냥 도커 컨테이너에 restart=always만 걸어놓으면 됐으니까. 결국 부랴부랴 자동으로 재.. 2023. 5. 28.
application 파일에서 자료구조(list, map) 사용법 개발을 하다보면 시스템 설정 같은 부분은 당연하게도 application.properties (혹은 yml)에서 담당하게 된다. 대부분의 설정은 String, Numeric 형태의 단일 값이지만, 가끔은 list, map 와 같은 형태로 사용을 하게 될 때도 존재했다. 이런 상황에서는 항상 구글링을 통해 해결을 했다. 그리고 그 때마다 언젠가는 블로그에 적어놓고 굳이 찾아다니지 말고 바로 적용해서 써야지... 라는 생각을 했었다. 그렇게 생각만 한지 몇 달이 되어 드디어 해당 포스팅을 작성해서 방법을 저장해놓을까 한다. 포스팅은 application.properties를 기반으로 작성한다. List 우선 List를 사용하는 방법이다. appliction.properties에서는 쉼표(,)를 이용해서 여러.. 2023. 5. 28.
NIFI 설치 및 사용법 현재 재직중인 회사가 빅데이터를 주로 다루는 회사이다보니, 프로그램 구축이 끝나고난 후 해당 프로그램을 통해 모인 데이터를 데이터 마트에 옮겨주는 작업까지 해야할 일이 종종 생겼다. 지난 프로젝트에서는 위의 작업을 Hue UI 내에서 Oozie와 Sqoop, 그리고 Hive의 유틸인 Beeline과 직접 만든 java application을 이용해서 데이터 마트 적재 플로우를 구축했다. 하지만 이번 프로젝트에서는 Hue가 설치되어 있지 않아 위와 같은 방법을 사용할 수 없었다. 그래서 대신 NIFI를 이용해 데이터 마트를 구축하기로 결정했다. nifi nifi란 데이터 ETL 툴 중 하나로, 분산환경에서 대량의 데이터를 수집하기에 용이한 프로그램이다. nifi는 실시간 처리에 적합하고, 웹 UI를 지원하.. 2023. 5. 21.