batch update

목표 한꺼번에 다수의 row를 업데이트 해야될 때, 하나씩 update 쿼리를 보내면 부하가 많이 발생할 수 있다. mybatis에서 batch update 방법을 알아본다. 방법 SqlSessionFactory를 통해 SqlSession을 생성하고 flush와 commit을 한다. sqlSessionFactory.openSession(ExecutorType.BATCH).use { sqlSession -> val xxxMapper = sqlSession.getMapper(XXXMaper::class.java) xxxs.forEach { xxxMapper.update(it) } sqlSession.flushStatements() sqlSession.commit() } SqlSession 트랜잭션을 commit 또는 rollback하고, Mapper 인스턴스를 획득할 수 있다. auto-commit이 꺼져있다면, commit 메서드를 호출하기 전까지 데이터베이스에 커밋되지 않는다. commit 메서드를 호출하지 않고 SqlSession이 닫힌다면 롤백된다. sqlSessionFactory....

2024-09-15 · 1 min · 82 words

AWS 보안 그룹에 내 IP를 추가할 때, 유동 IP면 어떡하지

기본적으로 IP 임대주기는 10분이지만 디바이스를 끄지 않으면 임대하고 있는 IP 계속 유지한다. 따라서 공유기에 물려있으면 IP가 바뀌는 경우가 드물다. 참고 자료 https://studyforus.tistory.com/137

2024-09-15 · 1 min · 22 words

AUTO_INCREMENT 1로 초기화 하기

ALTER TABLE tablename AUTO_INCREMENT = 1 https://stackoverflow.com/questions/8923114/how-to-reset-auto-increment-in-mysql

2024-09-15 · 1 min · 7 words

AssertJ 정확히 두 리스트가 같은지 확인

assertThat(a).hasSize(b.size()).hasSameElementsAs(b); hasSameElementsAs 는 b가 가지고 있는 요소들을 a가 전부 가지고 있는지 확인한다. 하지만 a가 중복된 값을 가지고 있다면 b가 하나만 가지고 있어도 통과가 되기 때문에, hasSize()로 크기 체크도 해야된다. https://www.baeldung.com/java-assert-lists-equality-ignore-order

2024-09-15 · 1 min · 30 words

Array 값 초기화 하기

고정된 크기의 배열을 선언하고, 전부 같은 값으로 초기화 해야되는 상황이 있었다. loop문을 통해서 모든 요소를 초기화하는 방법도 있지만, Arrays 에 이를 이미 구현해둔 내용이 있다. Clazz[][] board; Arrays.fill(row, new Clazz()); 내부 코드를 보면, 우리가 평소에 사용하는 기법대로 구현되어 있다. 참고 자료 https://stackoverflow.com/questions/7118178/arrays-fill-with-multidimensional-array-in-java#comment69858755_7118178

2024-09-15 · 1 min · 42 words

Apache 시작하기

설치 설치 과정은 따로 사내 문서에 없어서 공식 문서를 보면서 진행했다. 소스 코드 다운로드 및 압축 해제 wget https://dlcdn.apache.org/httpd/httpd-2.4.54.tar.gz gzip -d httpd-2.4.54.tar.gz tar xvf httpd-2.4.54.tar 다운로드 파일 경로는 아래 링크에서 확인이 가능하다. https://httpd.apache.org/download.cgi 빌드 cd httpd-2.4.54.tar ./configure 만약 설치 경로를 변겅하고 싶다면, -prefix 옵션으로 변경이 가능하다. (기본값 ‘/usr/local/apache2’) https://httpd.apache.org/docs/trunk/programs/configure.html 트러블슈팅 빌드를 시도하면 APR not found, APR-util not found, pcre-config for libpcre not found 등의 문제가 발생한다. 아래 링크를 통해서 해결할 수 있었다....

2024-09-15 · 3 min · 526 words

Apache 동작 방식

배경 Apache를 띄우고, mod_jk를 이용해 애플리케이션 서버와 연동하는 과정에서 계속 문제가 발생했다. 아무래도 Apache 동작 방식에 이해가 필요하다고 느껴져 간단하게 정리해본다. Apache의 용도나 웹서버의 역할은 다루지 않는다. Virtual Host Apache는 하나의 서버에서 여러 개의 웹사이트를 호스팅할 수 있다. Name-based Virtual Host 하나의 IP주소로 여러 개의 host를 가진다. NameVirtualHost로 이를 명시할 수 있고, ServerName을 통해 이름을 구분한다. httpd.conf 예시 NameVirtualHost *:80 <VirtualHost 192.168.0.108:80> ServerAdmin webmaster@example1.com DocumentRoot /var/www/html/example1.com ServerName www.example1.com </VirtualHost> <VirtualHost 192....

2024-09-15 · 1 min · 203 words

Apache POI 간단 사용법

목표 Apache POI가 무엇인지 이해한다. Apache POI를 통해 엑셀 파일을 읽고 쓰는 방법을 이해한다. Apache POI 엑셀 파일을 읽고 쓸 수 있도록 Java API를 제공해주는 라이브러리 사용하기 위해선 아래와 같이 의존성을 추가해줘야된다. <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>${apache.poi.version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${apache.poi.version}</version> </dependency> excel 파일 읽기 inputStream을 통해 Workbook을 만든다. Workbook 에서 getSheetAt()을 통해 원하는 sheet을 선택할 수 있다. getRow()와 getCell() 을 통해 원하는 셀의 값을 읽을 수 있다. @Test fun `when file is read then content is correct`() { val inputStream = this::class....

2024-09-15 · 1 min · 178 words

Apache (13)Permission denied 문제

문제 상황 Apache에서 js나 css 파일 요청을 받으면 permission denied로 403 Forbidden 응답을 보내는 문제는 문제가 발생했다. 해결 방법 mac에서 사용할 경우 추가적인 설정이 필요하다. System Preferences => Security & Privacy => Full Disk Access httpd에 접근 권한 부여 참고 자료 https://stackoverflow.com/questions/58455332/apache-gives-access-denied-on-macos-catalina

2024-09-15 · 1 min · 42 words

Active Directory의 기본 개념

Active Directory 란 규모가 있는 회사의 네트워크 상황을 Windows Server에 구현하기 위한 기술 네트워크 상으로 나눠져 있는 여러 자원을 중앙 관리자가 통합하여 관리하여, 본사 및 지사의 직원들은 자신의 PC에 모든 정보를 보관할 필요가 없어짐 용어 정리 Directory Service: 분산된 네트워크 관련 자원 정보를 중앙 저장소에 통합시켜 놓은 환경. Active Directory: Directory Service를 Windows Server에서 구현한 것 AD DS(Active Directory Domain Service): 컴퓨터, 사용자, 기타 주변 장치에 대한 정보를 네트워크 상에 저장하고 이러한 정보들을 관리자가 통합하여 관리하도록 해줌....

2024-09-15 · 6 min · 1093 words

9663

편집 시간: 2022년 2월 16일 오후 7:38 코드 Algorithm/9663.py at main · Junroot/Algorithm 풀이 재귀함수를 이용해서 모든 경우의 수를 탐색하면 된다. 퀸을 둘 때 대각선 방향의 인덱스 범위를 계산하는데 어려움을 겪었다.

2024-09-15 · 1 min · 31 words

9466

편집 시간: 2022년 3월 23일 오후 10:19 코드 Algorithm/9466.py at main · Junroot/Algorithm 풀이 사이클이 존재하는지 확인하는 과정이 필요했다. 서로소 집합을 사용해서 사이클이 존재하는지 확인했다. 선호하는 학생을 나타내는 구조를 방향 그래프로 그렸을 때 자신이 방향을 따라 갔을 때 최종적으로 가리키게 되는 숫자를 parent라고 정의한다. 배열을 이용해서 parent를 관리하다가, parent가 자기 자신이라면 사이클이 발생한 것이라고 확인할 수 있다. 다른 풀이 위상 정렬을 이용해서도 사이클을 구할 수 있다. import sys from collections import deque input = sys....

2024-09-15 · 1 min · 141 words

9465

편집 시간: 2022년 5월 14일 오후 10:33 코드 Algorithm/9465.py at main · Junroot/Algorithm 풀이 일단, 2줄의 스티커이므로 각 열마다 하나의 스티커만 선택할 수 있다는 것을 알 수 있었다. 그래서 처음에는 각 열마다 지그재그로 스티커를 선택한 두 가지 경우중 최대값이 정답이라고 생각했다. 하지만, 아래와 같이 한 열을 포기하고 선택하는 경우가 더 최대인 경우가 있었다. x x x 그래서 dp로 문제를 접근했다. f(x, y): 0번열부터 x열까지에서 x열 y행을 마지막으로 선택하는 경우의 최대값...

2024-09-15 · 1 min · 82 words

9328

편집 시간: 2022년 4월 12일 오후 3:02 코드 Algorithm/9328.py at main · Junroot/Algorithm 풀이 bfs를 이용하면 쉽게 해결할 수 있다. 이동하다가 문을 만났을 때, 열쇠가 있는지 판별하고 있다면 이동하고, 없다면 열쇠를 기다리는 문 컬렉션에 추가 하는 형태로 문제를 풀었다.

2024-09-15 · 1 min · 39 words

9252

편집 시간: 2022년 3월 24일 오후 1:45 코드 Algorithm/9252.py at main · Junroot/Algorithm 풀이 기존의 LCS 문제에서 dp원리를 이해하면 쉽게 해결할 수 있다. dp에 저장된 값을 보고 어떤 문자가 사용되었는지 확인하면되는데, 현재 위치에 저장된 값이 (왼쪽 위의 값) + 1인 순간이 해당 문자를 사용한 것이다.

2024-09-15 · 1 min · 45 words

9251(2)

오답 여부: o 편집 시간: 2022년 2월 24일 오후 6:02 코드 Algorithm/9251.py at main · Junroot/Algorithm 풀이 잘못된 풀이 문자열 하나에 대한 dp로 접근했다. 첫번째 문자열로 dp를 한다면 아래와 같이 접근할 수 있었다. f(x): x번째 문자열을 마지막으로 가지는 str2과의 (LCS, 마지막으로 사용한 index) f(n) = max( f(m) ) + 1 {m | m은 정수, 0 ≤ m < n, f(n)의 index > f(m)의 인덱스} max는 LCS가 같다면 마지막으로 사용한 index가 더 작은 것을 우선으로....

2024-09-15 · 1 min · 143 words

9251

편집 시간: 2022년 2월 18일 오후 6:45 잘못된 풀이 first = input() second = input() cache = [(0, 9999) for _ in range(len(first))] def find_indexes_in_second(char): result = [] for i in range(len(second)): if second[i] == char: result.append(i) return result for i in range(len(first)): char = first[i] indexes = find_indexes_in_second(char) if len(indexes) == 0: continue cache[i] = (1, indexes[0]) for j in range(i): max_length = cache[j][0] last_index = cache[j][1] for index in indexes: if last_index < index: if cache[i][0] < max_length + 1: cache[i] = (max_length + 1, index) break elif cache[i][0] == max_length + 1 and index < cache[i][1]: cache[i] = (max_length + 1, index) break print(max(cache)[0])

2024-09-15 · 1 min · 107 words

92345

날짜: 2022년 5월 24일 오후 7:27 코드 Algorithm/92345.py at main · Junroot/Algorithm 풀이 모두가 이상적인 플레이를 했을 때 승자와 패자가 이미 결정되어있는 31게임이 생각났다. 31게임의 전략에서 힌트를 얻어서 구현을 했다. 31게임의 승자의 기본전략은 마지막으로 30, 26, 22, 18, …., 2를 말하는 것이다. 이를 dicision tree로 그려볼면 이렇게 된다. 여기서 빨간색 테두리는 승자가 항상 승리할 수 있는 전략이 있는 상태를 표시해둔 것이다. 이를 승자 노드에서 보면 다음으로 가는 노드에 항상 승리할 수 있는 상태인 것이 최소 하나만 있으면 된다....

2024-09-15 · 3 min · 459 words

92344

날짜: 2022년 5월 25일 오후 6:31 오답: o 코드 Algorithm/92344.py at main · Junroot/Algorithm 풀이 잘못된 풀이 처음에 접근한 방법은 중복된 연산(덧셈, 뺄셈)을 피하기 위해서 배열의 표현을 자신의 왼쪽 또는 위쪽의 차이로 나타내려고 했다. 만약 자신의 왼쪽의 차이로 표현하면 아래 사진과 같다. 이렇게 하고 배열의 가로 길이가 더 길도록 transpose 하면 해결될 것이라고 생각했다. O(배열 세로 길이 * skill 길이)로 최악의 경우는 31 * 250000지만 시간초과가 발생했다. 맞는 풀이 결국 다른 사람 풀이를 확인했다....

2024-09-15 · 1 min · 168 words

92343

날짜: 2022년 3월 19일 오전 1:59 코드 Algorithm/92343.py at main · Junroot/Algorithm 풀이 단순한 백트래킹 문제였다… 트리의 특성을 이용하는 건줄 알고 너무 어렵게 생각했다. 데이터의 개수가 적으면 단순 탐색도 가능하다는 것을 신경써야되는데 이 부분을 놓쳤다.

2024-09-15 · 1 min · 35 words