Oracle 12c 에서 원래 데이터타입 'Long' 으로 사용하고 있다, Oracle 의 다른 버전들도 함께 사용해야 한다는 사실을 알게 되었다.

data type 'Long'을 'Clob'로 바꾸는 도중, 아래와 같은 에러를 만났다.

 

확인해 보니 insert 하려는 row들은 1000개가 넘어있었고, 

Mybatis 상 select-insert 중에 해당 에러가 발생하였다.

'clob'는 4GB까지 저장이 가능하지만, mybatis에 바인딩 시, 4000 bytes 가 넘으면 잘라서 저장해줘야 한다는 것...

 

rdbms를 오라클만 사용하는 게 아니라서 결국 공식문서를 뒤져보기로 했다 ,

확인해 보니

https://mybatis.org/mybatis-3/ko/configuration.html#typeHandlers 

 

mybatis – 마이바티스 3 | 매퍼 설정

매퍼 설정 마이바티스 XML 설정파일은 다양한 설정과 프로퍼티를 가진다. 문서의 구조는 다음과 같다.: configuration properties 이 설정은 외부에 옮길 수 있다. 자바 프로퍼티 파일 인스턴스에 설정할

mybatis.org

 

 

아래와 같은 샘플코드를 이용하여 작성하니 성공!

  <insert id="insert2">
      insert into users2 (id, name, funkyNumber, roundingMode) values (
        #{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=org.apache.ibatis.type.ClobTypeHandler}
      )
  </insert>

 

아래의 공식을 확인 후, 필요한 타입핸들러를 작성하면 된다 !

https://mybatis.org/mybatis-3/ko/configuration.html#typeHandlers

 

mybatis – 마이바티스 3 | 매퍼 설정

매퍼 설정 마이바티스 XML 설정파일은 다양한 설정과 프로퍼티를 가진다. 문서의 구조는 다음과 같다.: configuration properties 이 설정은 외부에 옮길 수 있다. 자바 프로퍼티 파일 인스턴스에 설정할

mybatis.org

 

 

오늘 아침부터 지금 두 문제 각 잡았다.

뭔가 둘 다 비슷해보여서 .. 이름도 비슷하고 ..

사실 지금 포스팅하는거는 며칠 전에 했는데 내 것으로 하기까지 시간이 걸렸다.

(어떤 분 것을 참고해 그냥 외웠다 .. 큰일이다 ..)

근데 만약 알고리즘 쉬면 못풀거같긴하다 ..

 

이진트리인데 순서에 상관없이 나열하라는 듯 하다

 

public List<TreeNode> generateTrees(int n) {
	return DFS(1, n);
}

public List<TreeNode> DFS(int start, int end) {
	List<TreeNode> answer = new ArrayList<>();
	if (start > end) {
		answer.add(null);
		return answer;
	}
	if (start == end) {
		answer.add(new TreeNode(start));
		return answer;
	}
	List<TreeNode> lt, rt;
	for (int i=start; i<=end; i++) {
		lt = DFS(start, i-1);
		rt = DFS(i+1, end);
		for (TreeNode x : lt) {
			for (TreeNode y : rt) {
				TreeNode tn = new TreeNode(i);
				tn.left = x;
				tn.right = y;
				answer.add(tn);
			}
		}
	}
	return answer;
}

'알고리즘 공부 > Leetcode' 카테고리의 다른 글

[Tree] Binary Tree Inorder Traversal  (0) 2022.03.30
[Array] Container With Most Water  (0) 2022.03.29
[Array] Median of Two Sorted Arrays  (0) 2022.03.29

. 동작중인 컨테이너 확인

$ docker ps

. 정지된 컨테이너 확인

$ docker ps -a

. 컨테이너 삭제 (정지된 컨테이너일 경우)

$ docker rm 컨테이너ID

. 컨테이너 삭제 (정지 상관 없이)

$ docker rm -f 컨테이너ID

. 컨테이너 복수 삭제

$ docker rm 'docker ps -a -q'

. 컨테이너 모두 삭제 (정지된 컨테이너 일 경우)

$ docker container prune

 


 

. 볼륨 생성

$ docker volume create 볼륨명

. 볼륨 모두 삭제

$ docker volume prune

. 특정 볼륨 삭제

$ docker volume rm 볼륨명

. 전체 볼륨 확인

$ docker volume ls

 

Advice 의 종류와 사용법 !!

 

1. @Around

가장 널리 사용되는 advice로, 대상 객체의 메서드를 실행 전, 후 또는 익셉션 발생 시점에서 원하는 기능을 삽입할 수 있다.

@Around("execution(public * springframework.com..impl.*Impl.selectArticleDetail*(..))")

 

2. @After

대상 객체의 메서드를 실행하는 도중 익셉션 발생 여부와 상관없이 메서드 실행 후 기능을 실행한다.

@After("execution(public * springframework.com..impl.*Impl.selectArticleDetail*(..))")

 

3. @AfterReturning

대상 객체의 메서드가 익셉션없이 실행된 이후 기능을 실행한다.

@AfterReturning(pointcut = "execution(public * springframework.com..impl.*Impl.selectArticleDetail*(..))", returning = "obj")

 

4. @AfterThrowing

익셉션이 발생한 경우에 기능을 실행한다.

@AfterThrowing(pointcut = "execution(public * springframework.com..impl.*Impl.selectArticleDetail*(..))", throwing = "exception")

 

5. @Before

객체의 메서드 호출 전에 기능을 실행한다.

@Before("execution(public * springframework.com..impl.*Impl.selectArticleDetail*(..))")

 

각 패턴은 '*'을 이용하여 모든 값을 표현할 수 있고 , '..'는 0개 이상이라는 뜻ㅇㅣ다 !!

 

그리고 검색하다보면 ProceedingJointPoint 메서드를 볼 수 있다.

이 메서드는 파라미터로 부터 전달받은 값(?)이며 사용법은

Object result = jointPoint.proceed();

로 매서드를 호출한다.

 

그리고 해당 객체에 대한 정보, 실행되는 메서드에 대한 정보. 메서드를 호출할 때 전달된 인자에 대한 정보는 ProceedingJointPoint 인터페이스에서 메서드를 제공해준다 !

Object getTarget(); // 대상 객체를 구한다.
Signature getSignature(); // 호출되는 메서드에 대한 정보를 구한다.
Object[] getArgs(); // 파라미터 목록을 구한다.

 

 

참고 서적 : 초보 웹 개발자를 위한 스프링 4 프로그래밍 입문

이 문제는 인프런 선생님이 알려주신 문제 ...

혹시나 했는데 한방에 풀어서 다행이다.

 

===== 문제 =====

 

===== 답 =====

inorder traversal : 중위 순회

왼 -> root -> 오

import java.util.ArrayList;
import java.util.List;
static List<Integer> answer;
public List<Integer> inorderTraversal(TreeNode root) {
	answer = new ArrayList<>();
	DFS(root);
	return answer;
}
public void DFS(TreeNode root) {
	if (root == null) {
		return;
	} else {
		DFS(root.left);
		answer.add(root.val);
		DFS(root.right);
	}
}

 

끝 ..?

 

==========

마지막에 이렇게 하면 전위순회 (root -> 왼 -> 오)

answer.add(root.val);
DFS(root.left);
DFS(root.right);

이렇게 하면 후위순회 (왼 -> 오 -> root)

DFS(root.left);
DFS(root.right);
answer.add(root.val);

'알고리즘 공부 > Leetcode' 카테고리의 다른 글

[Tree] Unique Binary Search Trees II  (0) 2022.04.06
[Array] Container With Most Water  (0) 2022.03.29
[Array] Median of Two Sorted Arrays  (0) 2022.03.29

DB 마다 달라서 ..

전에 My SQL 로 작업할 때는 이렇게 안했던거 같은뎁 .. 

여튼 기록해 놓으려고 한다 !

 

1. 방화벽 열기

윈도우 검색에 방화벽만 검색해도 나온다

 

'방화벽 상태 확인' 선택 하면 아래와 같은 화면이 나오는데 여기에서

'고급 설정' 선택하기

 

'인바운드 규칙' 선택 후 '새규칙' 선택

 

나는 db 포트를 열 것이기 때문에 포트 선택 후 특정 포트를 입력해주었다.

그 후 다른 설정은 그대로 두고 다음 버튼을 눌렀다.

 

마지막 이름작성 화면에서 나중에 컨트롤 할 수 있게 기억할 수 있는 이름으로 등록해주었다.

그런 뒤 '마침'

 

이런 식으로 '인바운드 규칙' 목록에서 확인할 수 있다.

 

2. 그런 뒤, postgreSQL 의 설정을 수정해주어야한다 ..

경로는 postgreSQL이 설치된 폴더의 data까지 이동한다.

그런 뒤, 'pg_hba.conf' 파일을 찾는다.

 

3. 아래의 코드를 밑에 이미지와 같이 추가해준다.

host    all             all             0.0.0.0/0            scram-sha-256

 

왜 0.0.0.0/0 으로 하냐?

모든 IPv4 address에서 사용하고 싶기 때문이다 .. 

만약 다른 옵션을 확인하고 싶으면 아래에 더 설명이 잘되어있다.

https://stackoverflow.com/questions/3278379/how-to-configure-postgresql-to-accept-all-incoming-connections

 

How to configure PostgreSQL to accept all incoming connections

I've got a PostgreSQL data base that I'd like to configure to accept all incoming connections regardless of the source IP address. How can this be configured in the pg_hba.conf file? I'm using post...

stackoverflow.com

 

3. 그리고 마지막 관문 !!

'서비스' 에 들어가서 'postgresql-' 로 시작하는 서비스를 찾는다. 

 

마우스 오른쪽 버튼을 클릭 후 '다시시작' 을 클릭한다.

 

4. DBeaver 에서 확인해보면 성공 !!!!

(내가 사용하는 DB 관리 툴이 DBeaver 이다.. 각자 사용하는 툴로 확인해보면 아마 성공 ..?)

Host는 외부에서 붙을 본인의 ip주소를 입력하고, port 는 방금 열었던 방화벽의 포트를 입력해준다 .. 

끝 !!

 

( 아, 같은 망에서만 가능한 방법이다 ..)

'sql > postgresql' 카테고리의 다른 글

[Postgresql] 속도가 느려지는 function .. 기록  (0) 2022.03.20
public int maxArea(int[] height) {
	int answer = 0;
	int start = 0, end = height.length-1;
	while (start < end) {
		answer = Math.max((end-start)*Math.min(height[start], height[end]), answer);
		if (height[start] < height[end]) {
			start++;
		} else {
			end--;
		}
	}
	return answer;
}

'알고리즘 공부 > Leetcode' 카테고리의 다른 글

[Tree] Unique Binary Search Trees II  (0) 2022.04.06
[Tree] Binary Tree Inorder Traversal  (0) 2022.03.30
[Array] Median of Two Sorted Arrays  (0) 2022.03.29

항상 목표는 시간이 얼마나 걸리더라도 스스로 푸는 것 ..

언젠가는 시간이 단축되게찌 .... ㅠㅠ

import java.util.Arrays;
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
	double answer = 0L;
	int numsLen = nums1.length + nums2.length;
	int[] nums = new int[numsLen];
	System.arraycopy(nums1, 0, nums, 0, nums1.length);
	System.arraycopy(nums2, 0, nums, nums1.length, nums2.length);
	Arrays.sort(nums);
	if (numsLen%2 == 1) { // 홀수
		answer = nums[numsLen/2];
	} else { // 짝수
		double l = (nums[numsLen/2] + nums[numsLen/2 -1]);
		answer = l/2;
	}
	return answer;
}

'알고리즘 공부 > Leetcode' 카테고리의 다른 글

[Tree] Unique Binary Search Trees II  (0) 2022.04.06
[Tree] Binary Tree Inorder Traversal  (0) 2022.03.30
[Array] Container With Most Water  (0) 2022.03.29

+ Recent posts