SMALL

Customizing Response 

애플리케이션을 개발하는 과정에서

응답의 헤더에 특정 값을 추가하고 싶은 경우나

응답의 특정 데이터 값을 교체하고 싶은 경우가 있을 수 있다.

 

이러한 경우에 어떻게 해야 하는지 알아보자.

 

Interface ResponseBodyAdvice + @ControllerAdvice 

ResponseBody 데이터 접근 가능( 수정 가능 ) 

 

interceptor의 경우 postHandler method를 통해 controller 호출 이후에 접근이 가능하지만,

응답 객체에 접근 불가능 ( body에 접근 불가)

@ControllerAdvice
public class TestResponseBodyAdvice implements ResponseBodyAdvice<T> {

    // Implementation
}

 

메서드 설명 

 

@ControllerAdvice
public class TestResponseBodyAdvice implements ResponseBodyAdvice<T> {

    @Override
    public boolean supports(MethodParameter returnType, 
                            Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public T beforeBodyWrite(T body, MethodParameter returnType, 
                    MediaType selectedContentType,
                    Class<? extends HttpMessageConverter<?>> selectedConverterType, 
                    ServerHttpRequest request,
                    ServerHttpResponse response) {
        
        return body;
    }
}

 

supports 

controller 작업이 끝난 response를 beforeBodyWrite 메서드에 보낼지 판단 

판단하는 기준으로는 해당 메서드의 파라미터인 controller의 returnType정보, messageConverter 정보가 있다.

 

beforeBodyWrite

controller 작업이 끝나고 어떠한 Converter를 통해 응답을 보낼지 결정된 후에 불린다.

다만, Converter를 통하지 않은 상태이다. ( 어떠한 converter를 사용할지는 정해졌지만, 아직 convert 하지는 않은 상태 )

이 메서드에서 실제 사용자가 원하는 body의 값을 교체 또는 response에 헤더 정보를 추가할 수 있다.

 

RequestBodyAdvice

ResponseBodyAdvice와 유사하게 RequestBodyAdvice interface 사용 가능

LIST
SMALL

Given an array nums with n objects colored red, white, or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white, and blue.

We will use the integers 0, 1, and 2 to represent the color red, white, and blue, respectively.

You must solve this problem without using the library's sort function.

 

빨간색, 하얀색, 파란색으로 이루어진 n개의 요소를 가진 nums 배열이 주어진다.

새로운 배열을 선언하지 않고 제자리에서, 동일한 색이 서로 붙어 있도록 정렬을 하라.

순서는 빨간색 - 하얀색 - 파란색이다.

int값 0, 1, 2는 빨간색 - 하얀색 - 파란색을 나타낸다.

배열 기능이 존재하는 라이브러리를 사용하지 않고 문제를 풀어라. 

 


3개의 숫자로 이루어진 배열을 정렬해야 하는데, 추가적인 공간을 사용하지 않아야 한다.

배열의 맨 앞에 0과 swap할 포인터

배열의 맨 뒤에 2와 swap할 포인터를 둔다.

그리고 배열의 처음부터 끝까지 탐색할 포인터를 두어 해당 포인터의 값이 0이면 앞에 포인터와 swap

포인터의 값이 2이면 뒤에 포인터와 swap 하는 방식으로 문제를 해결할 수 있다.

다만, swap시 앞에 포인터에 해당하는 값은 탐색 포인터가 탐색한 값이므로 한번 더 체크할 필요가 없지만

뒤의 포인터와 swap한 값은 검증이 되지 않은 값이므로 체크해야 한다.

 

    public void sortColors(int[] nums) {
        int i = 0;
        int j = nums.length - 1;

        int p = 0;

        while (j >= p) {
            if (nums[p] == 0) {
                swap(i, p, nums);
                i++;
                p++;
            } else if (nums[p] == 2) {
                swap(j, p, nums);
                j--;
            } else {
                p++;
            }
        }
    }

    private void swap(int i, int j, int[] nums) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }

 

문제 출처 : 

https://leetcode.com/problems/sort-colors/

 

Sort Colors - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

 

LIST
SMALL

프로시저란

여러 개의 query를 마치 하나의 함수처럼 실행하기 위한 query의 집합이다.

만들어 두기만 하면 함수처럼 호출하여 편하게 사용할 수 있다.

여기서 프로시저를 "함수처럼"이라고 표현하였는데 

함수와는 다르다

 

프로시저 함수

함수(Function)

리턴 값이 필수로 하나만 존재해야 한다.

클라이언트에서 수행된다.

주로 간단한 계산, 수치 등 결과를 나타낼 때 주로 사용된다.

 

프로시저(Procedure)

리턴 값에 대한 제약이 없다. ( 있을 수도, 없을 수도 여러 개 존재할 수도)

서버에서 실행된다. (클라이언트에서 수행되는 것보다는 속도가 빠르다)

 

프로시저 정의(생성)

DELIMITER $$
CREATE PROCEDURE 'DESC_PROC' (
    -- 파라미터 선언
    NAME VARCHAR(20),
    AGE INT
)
BEGIN
    -- 변수 선언
    DECLARE VAL_NUM INTEGER;
    
    -- 쿼리문
    SELECT COUNT(*) + 1
    	INTO VAL_NUM
        FROM desc_table;
        
    -- 쿼리문
    INSERT INTO desc_table(total_count, uname, uage) VALUES(VAL_NUM, NAME, AGE);
END $$
DELIMITER ;

CREATE PROCEDURE를 통해 선언 

BEGIN - END 사이에 SQL문 및 변수 선언

DELIMITER는 프로시저 내부의 SQL문에 세미콜론이 존재하여

프로시저가 끝나지 않았는데 끝난 것으로 인식할 수 있는 부분을 방지하기 위해 선언

 

프로시저 호출

CALL DESC_PROC('Jun', 33);

 

프로시저 목록 확인

SHOW PROCEDURE STATUS \G --서버에 어떤 저장 프로시저가 있는지 확인

 

SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES 
  WHERE ROUTINE_TYPE='PROCEDURE'; -- INFORMATION_SCHEMA 확인

 

SHOW CREATE PROCEDURE Reset_animal_count \G --저장 프로시저가 수행하는 작업을 확인

조회하고자 하는 프로시저의 명을 입력 ( 예시 프로시저명 : Reset_animal_count )

 

프로시저 제거 

DROP PROCEDURE Reset_animal_count();

 

etc..

sql tool을 이용하는 경우에는 아래와 같은 편의 기능도 제공한다.

 

tool을 이용해 생성된 프로시저 틀 

 

참고내역 :  

https://mariadb.com/kb/ko/stored-procedure-overview/#%EC%A0%80%EC%9E%A5-%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80-%EA%B6%8C%ED%95%9C

 

Stored Procedure Overview

A Stored Procedure is a routine invoked with a CALL statement.

mariadb.com

 

LIST
SMALL

Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.

 

intervals[i] = [starti, endi]에 해당하는 interval 배열이 주어진다.

중복되는 모든 interval을 병합하라.

그리고 중복되는 interval이 없는 배열을 반환하라, 단 입력값으로 받은 모든 interval을 커버해야 한다.

 


배열의 각각의 범위가 중복되는 위치를 찾아야 한다.

처음에 주어진 내용만 본다면 어떻게 해야 하는지 감이 잡히지 않는다.

우선, 주어진 배열의 startIndex기준으로 정렬을 해보자.

어느 정도 정렬이 된다면, 앞에 배열과 뒤에 배열의 값들을 비교해주면 된다.

예를 들어 intervals[0][1] > intervals[1][0] 인 경우라면 중복되는 구역이 존재하는 것이다.

중복되는 구역이 존재한다면, 두 배열을 합치고 비교를 이어가면 된다.

 

시간 복잡도는 주어진 배열을 정렬하는 시간인 O(nlogn)이 소요된다.

 

    public int[][] merge(int[][] intervals) {

        // sorting - time complex - o(nlogn)
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);

        int[][] rst = new int[intervals.length][2];
        rst[0] = intervals[0];
        int j = 0;
        for (int i = 1; i < intervals.length; i++) {
            if (rst[j][1] >= intervals[i][0]) {
                // join
                rst[j][1] = Math.max(rst[j][1], intervals[i][1]);
            } else {
                rst[++j] = intervals[i];
            }
        }

        int[][] r = new int[j + 1][2];
        for (int i = 0; i < j + 1; i++) {
            r[i] = rst[i];
        }

        return r;
    }
LIST

+ Recent posts