// you can also use imports, for example:
import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
    
    public int solution(int[] A) {
        // write your code in Java SE 8
        
        if (A.length < 3) {
            return 0;
        }
        Arrays.sort(A);
        
        int start = 0;
        while (start < A.length) {
            if (A[start] > 0) {
                break;
            }
            start++;
        }
        
        if (start >= A.length) {
            return 0;
        }
        
        int result = 0;
        for (int i = 0; i < A.length-1; i++) {
            for (int j = (i+1); j < A.length-1; j++) {
                
                if ((long)A[i] + (long)A[j] > (long)A[j+1]) {
                    result = 1;
                    break;
                }
            }
            if (result == 1) {
                break;
            }
        }
        
        return result;
    }
}

'알고리즘' 카테고리의 다른 글

[codility] lesson5 - PassingCars  (0) 2020.08.14
[codility] lesson4 - FrogRiverOne  (0) 2020.08.13
[codility] lesson3 - FrogJmp  (0) 2020.08.12
[codility] lesson2 - CyclicRotation  (0) 2020.08.12
[codility] Lesson1 - Binary Gap  (0) 2020.08.12
// you can also use imports, for example:
// import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
    public int solution(int[] A) {
        // write your code in Java SE 8
        
        if (A.length == 1) {
            return 0;
        }
        
        int start = 0;
        while (start < A.length) {
            if (A[start] == 0) {
                break;
            }
            start++;
        }
        
        if (start == A.length) {
            return 0;
        }
        
        int pCount = 0;
        int result = 0;
        for (int i = start; i < A.length; i++) {
            if (A[i] == 0) {
                pCount++;
            } else {
                result += pCount;
            }
            
            if (result > 1000000000) {
                result = -1;
                break;
            }
        }
            
        return result;
    }
}

'알고리즘' 카테고리의 다른 글

[codility] lesson6 - Triangle  (0) 2020.08.15
[codility] lesson4 - FrogRiverOne  (0) 2020.08.13
[codility] lesson3 - FrogJmp  (0) 2020.08.12
[codility] lesson2 - CyclicRotation  (0) 2020.08.12
[codility] Lesson1 - Binary Gap  (0) 2020.08.12
// you can also use imports, for example:
 import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
    public int solution(int X, int[] A) {
        // write your code in Java SE 8
        
        int[] positions = new int[X];
        int result = -1;
        int count = 0;
        int i;
        for (i = 0; i < A.length; i++) {
            int idx = A[i] - 1;
            if (idx < X) {
                if ( positions[idx] == 0 ) {
                    positions[idx]++;
                    count++;
                }
            }
            
            if (count == X) {
                result = i;
                break;
            }
        }
        
        return result;
    }
    
}

 

'알고리즘' 카테고리의 다른 글

[codility] lesson6 - Triangle  (0) 2020.08.15
[codility] lesson5 - PassingCars  (0) 2020.08.14
[codility] lesson3 - FrogJmp  (0) 2020.08.12
[codility] lesson2 - CyclicRotation  (0) 2020.08.12
[codility] Lesson1 - Binary Gap  (0) 2020.08.12
// you can also use imports, for example:
// import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
    public static int solution(int X, int Y, int D) {
        // write your code in Java SE 8
        
        int diff = Y-X;
        if (diff == 0) {
            return diff;
        }
        
        int result = diff / D;
        if ((result * D + X) == Y) {
            return result;
        }
        return result + 1;
    }
}

'알고리즘' 카테고리의 다른 글

[codility] lesson5 - PassingCars  (0) 2020.08.14
[codility] lesson4 - FrogRiverOne  (0) 2020.08.13
[codility] lesson2 - CyclicRotation  (0) 2020.08.12
[codility] Lesson1 - Binary Gap  (0) 2020.08.12
[codility] lesson2 - OddOccurrencesInArray  (0) 2020.08.12
// you can also use imports, for example:
// import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
    public int[] solution(int[] A, int K) {
        // write your code in Java SE 8
        
        int len = A.length;
        int[] result = new int[len];
        for (int i = 0; i < len; i++) {
            int movedIdx = (i + K) % len;
            result[movedIdx] = A[i];            
        }
        
        return result;
    }
}

'알고리즘' 카테고리의 다른 글

[codility] lesson5 - PassingCars  (0) 2020.08.14
[codility] lesson4 - FrogRiverOne  (0) 2020.08.13
[codility] lesson3 - FrogJmp  (0) 2020.08.12
[codility] Lesson1 - Binary Gap  (0) 2020.08.12
[codility] lesson2 - OddOccurrencesInArray  (0) 2020.08.12
// you can also use imports, for example:
// import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
    public int solution(int N) {
        // write your code in Java SE 8
        
        char[] charArr = Integer.toBinaryString(N).toCharArray();
        int bg = 0;
        int maxBg = 0;
        int zeroCount = 0;
        int oneCount = 0;
        
        for (int i = 0; i < charArr.length; i++) {
            int el = charArr[i] - '0';
            if (el == 1) {
                bg = zeroCount;
                if (bg > maxBg) {
                    maxBg = bg;
                }
                oneCount = 1;
                zeroCount = 0;
            } else if (el == 0) {
                zeroCount++;
            }
        }
        
        return maxBg;
    }
}

'알고리즘' 카테고리의 다른 글

[codility] lesson5 - PassingCars  (0) 2020.08.14
[codility] lesson4 - FrogRiverOne  (0) 2020.08.13
[codility] lesson3 - FrogJmp  (0) 2020.08.12
[codility] lesson2 - CyclicRotation  (0) 2020.08.12
[codility] lesson2 - OddOccurrencesInArray  (0) 2020.08.12
// you can also use imports, for example:

 import java.util.*;



// you can write to stdout for debugging purposes, e.g.

// System.out.println("this is a debug message");



class Solution {

    public int solution(int[] A) {

        // write your code in Java SE 8

        Arrays.sort(A);
        int result = 0;

        for (int i = 0; i < A.length; i+=2) {

        if (A[i] == A.length - 1 || A[i] != A[i+1] ) {
                result = A[i];
                break;
            }
        }

        return result;

    }

}

'알고리즘' 카테고리의 다른 글

[codility] lesson5 - PassingCars  (0) 2020.08.14
[codility] lesson4 - FrogRiverOne  (0) 2020.08.13
[codility] lesson3 - FrogJmp  (0) 2020.08.12
[codility] lesson2 - CyclicRotation  (0) 2020.08.12
[codility] Lesson1 - Binary Gap  (0) 2020.08.12

Spring Boot 프로젝트를 진행하던 중 평소처럼 서비스단에서 transaction 처리를 해주던 중 transaction이 제대로 구현되지 않는 문제가 발생했다. 

알고 보니 특정 케이스에 대해 명시적으로 throw 해준 부분(Checked Exception)에 대해서는 자동으로 @Transactional 어노테이션이 작동하지 않았다. 추가 옵션으로 롤백할 클래스명을 지정해줘야한다는..!

@Trasaction(rollbackFor = {Exception.class}

단, try catch로만 명시적으로 처리해줄때에는 해당 Exception을 catch문에서 잡기때문에 Spring이 감지하여 transaction 처리를 해줄수 없기때문에 try catch를 쓰지않고 throw하거나 catch 문에서 throw를 해줘야한다. (

후 역시 공부는 해도해도 끝이 없는것같다.

찾아본김에 적는 자바의 Exception 종류도 정리해보았다.

Error (java.lang.Error)

주로 시스템(VM)에서 발생시키는 에러 상황. 애플리케이션단에서 처리는 어렵고 보통은 컴파일단에서 나타남

 

Checked Exception

개발자가 작성한 코드내에서 발생할 수 있는 예외상황.

Checked Exception은 Exception클래스의 자식 클래스이지만 RuntimeException 클래스은 상속받지 않음

 

Unchecked Exception

java.lang.RuntimeException 클래스를 상속받은 예외상황

예를 들어 NullPointerException, IllegalArgumentException 등등 개발자의 부주의로 발생할 수 있는 예외를 정의해놓은 클래스들.

 

 

최근 회사에서 프로젝트를 진행하면서 Spring Security CSRF를 도입했다.

CSRF는 사이트 간 요청 위조를 막는 방법이다.

사이트간 요청 위조를 막는 방법에는 Referrer 검증이나 CSRF 등이 있는데 

 

Referrer 검증request header에 있는 referrer 속성(요청페이지의 정보가 담긴 속성)을 검증하여 차단하는 방식으로

header를 파악하여 같은 도메인이 아니면 요청을 차단하는 식으로 요청위조를 차단할 수 있다.

 

CSRF는 랜덤한 토큰값을 세션에 저장하고 사용자의 모든 요청(Request)에 대하여 서버단에서 검증하는 방법이다.

spring5에서는 csrf enable이 디폴트 이므로 이를 구현하기 위해서는 csrf 토큰을 요청페이지마다 심어두기만 하면 적용가능하다. 사용하지 않을 경우 SecurityConfig 클래스에서 csrf().disable() 설정만 추가해주면 된다.

 

이번에 진행한 프로젝트에서 CSRF 적용된 프로젝트를 테스트하던 중 단일 개발서버에서는 문제가 되지 않는데, 이중화되어있는 운영서버에  올렸더니 페이지가 넘어가거나 ajax 같은 새로운 요청이 있을때마다 403에러가 뜨는 현상이 발생했다.(페이지마다 csrf토큰은 잘 넣어줬는데도.. ) 그래서 현재는 csrf 설정을 disable 시켜놓은 상태인데 왜 이런 현상이 생기는지 더 찾아봐야 할 것 같다.

 

 

 

 

 

'Web > Spring Framework' 카테고리의 다른 글

Spring Transaction 처리  (0) 2020.01.14
Spring Exception 처리 방법  (0) 2019.08.12
SpringMVC - View의 이해  (1) 2018.08.31
Spring Boot 세팅하기1 - 프로젝트 생성  (0) 2018.08.28
Spring Framework 세팅하기1 - 설치  (0) 2018.05.29

기존에는 무조건 datetime 만 사용했었는데 datetime2 타입이 따로 있었다고한다ㅠ

(이직한 회사 ERD 에는 전부 datetime2로 되어있...)

 

datetime
- 날짜와 시간 표시
- 1953년 1월 1일부터 가능.
- [년-월-일 시:분:초.123]  // [2019-04-26 09:00:00.007] 
- 8Byte

- 1953년 이전의 날짜를 저장하지 못하며(에러 발생), 초 이하의 정확도가 떨어짐.
- .000, .003 또는 .007초 단위로 반올림
- SQL표준에 맞지 않고, 정확도가 떨어져서 공식문서에서는 비권장

datetime2
- [년-월-일 시:분:초[.100ns]],
- [YYYY-MM-DD hh:mm:ss[.소수자릿수 초]]  // [2019-04-26 09:00:00.1234567] 
- 자릿수가 3보다 작은 경우 6Byte
자릿수가 3 또는 4인 경우 7Byte
기타 8Byte
- SQL Server 2008부터 지원

 

참고글

https://comnic.tistory.com/11

'데이터베이스 > MSSQL' 카테고리의 다른 글

MSSQL 프로시저 수행 옵션  (0) 2019.08.13

+ Recent posts