반응형

스프링부트 사용하면서부터 RestTemplate을 많이 사용하여 API개발을 해왔었다.

하지만 최근에 알게된 사실은 블로킹 API로 리액티브 기반의 애플리케이션에서의 성능을 떨어트리는 원인이 될 수 있다는 걸 알게 되었다. 또한 Spring5.0버전부터는 RestTemplate은 유지모드로 변경되고 향우 deprecated될 예정이라고 한다.

따라서 대안으로 Spring에서는 WebClient사용을 권고하고 있으며 다음과 같은 장점이 있다.

  • Non-blocking I/O
  • Reactive Streams back pressure
  • High concurrency with fewer hardware resources
  • Functional-style, fluent API that takes advantage of Java 8 lambdas
  • Synchronous and asynchronous interactions
  • Streaming up to or streaming down from a server

WebClient에 대한 자세한 사용법에 대해서 알고 싶다면 아래의 블로그 글을 참고하자.

medium.com/@odysseymoon/spring-webclient-%EC%82%AC%EC%9A%A9%EB%B2%95-5f92d295edc0

 

Spring WebClient 사용법

Spring 어플리케이션에서 HTTP 요청을 할 땐 주로 RestTemplate 을 사용했었습니다. 하지만 Spring 5.0 버전부터는 RestTemplate 은 유지 모드로 변경되고 향후 deprecated 될 예정입니다.

medium.com

 

스프링공식문서

www.baeldung.com/spring-webclient-resttemplate

 

Spring WebClient vs. RestTemplate | Baeldung

Learn how to make server-side HTTP calls using WebClient and RestTemplate.

www.baeldung.com

 

반응형
반응형

최근 읽고 있는 '자바 최적화'라는 책을 보다가 몰랐었던 내용이 있어 기록할겸 남겨본다. 

자바7 이전 리소스 사용후 닫는 것은 온전히 개발자의 몫

    public void readFirstLineOld(File file) throws IOException {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(file));
            String FirstLine = reader.readLine();
        } finally {
            if (reader != null) {
                reader.close();
            }
        }
    }

 

자바7 부터 언어 자체에 추가된 try-with-resources 생성자를 이용하면 try키워드 다음의 괄호 안에 리소스(AutoCloseable 인터페이스를 구현한 객체만 가능)를 지정해서 생성할 수 있다. 이로써 try 블록이 끝나는 지점에 개발자가 close() 메서드 호출을 깜빡 잊고 빠뜨려도 자동으로 호출된다. close() 메서드는 방금 전 예제와 똑같이 호출되고 비지니스 로직의 예외 발생 여부와 상관없이 무조건 실행된다.

    public void readFirstLineOld(File file) throws IOException {
        try( BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String FirstLine = reader.readLine();
        }
    }

코드가 훨씬 심플해졌다. 하지만 try-with-resources 생성자 사용시 자동으로 close() 를 호출해주는 것을 몰랐다면 finally 코드를 생성해 그 안에서 또 close를 호출하려고 하였을거다...

위의 예에서는 catch(IOException exception) {} 과 같이 별도로 에러처리를 안해주고 그냥 상위로 exception을 그냥 던져버리는데 사실 좋지 않다. 항상 에러 발생시 catch 내부에서 잡고 로깅해주고 처리해주는 것이 좋다.

이번 포스팅을 하며 느낀점은 기본에 좀 더 충실한 공부가 필요할 것 같다.

 

반응형
반응형

자바 스트림 Skip 사용시 java.lang.IllegalArgumentException: -number 형태의 에러가 나는 이유는

skip 메서드의 인자로 0보다 작은 값이 들어 갔기 때문이다.

따라서 어떤 수치를 계산해서 skip에 인자를 전달하고 있다면 해당 값이 0보다 작지 않은 지 확인해보자.

skip 내부 로직

반응형
반응형

Upper of POI 3.x Version, cell fill color is set as follows

setFillBackgroundColor (x)

setFillForegroundColor (0)

자바 엑셀 파일 배경색이 계속 검정색이거나 안바뀔 때는 setFillForeGroundColor대신 setFillForeGroundColor를 사용하자. POI 3.x윗 버전부터는 ForegroundColor를 써야 바뀌는듯....

        CellStyle styleBlueColor = workbook.createCellStyle();
        styleBlueColor.setFillForegroundColor(IndexedColors.CORNFLOWER_BLUE.getIndex());
        styleBlueColor.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        cell = row.createCell(0);
        cell.setCellStyle(styleLimeColor);
        cell.setCellValue("인보이스번호");
반응형
반응형

프론트쪽을 개발하다가 최근에 버그를 발견하고 포스팅 남겨본다.

            var endDate = new Date(date).getTime();
            var now = new Date().getTime();
            var diff = parseInt((endDate-now)/(24*3600*1000));

            //if ((!Object.is(diff, -0)) && (diff <= 7)) {  => 이게 맞는방식
            if ((diff >= 0) && (diff <= 7)) {   => 버그 생성 방식
                return true;
            } else {
                return false;
            }

위의 코드는 두 날짜를 비교하는 코드이다.

diff는 두 날짜의 차이를 숫자로 나타내 주는데 현재 날짜가 endDate보다 크다면 -0을 반환하게 된다.

만약 위와 같이 diff가 0보다 클 경우라고 조건을 주게 되면 -0일 경우 포함이 안될거라고 생각하지만....그렇게 생각한다면 경기도 오산이다.

자바스크립트에서는 다음과 같이 0과 -0이 같다고 생각한다.

따라서 값을 비교할 때는 위의 코드에서 주석처리된 것과 같이 처리해주어야 한다.

 

자세한 설명은 아래의 stackoverflow의 글을 참고하도록 하자

stackoverflow.com/questions/7223359/are-0-and-0-the-same

 

Are +0 and -0 the same?

Reading through the ECMAScript 5.1 specification, +0 and -0 are distinguished. Why then does +0 === -0 evaluate to true?

stackoverflow.com

 

반응형
반응형

객체를 복사 할 때 단순하게 '=' 연산자로 값을 주입하게 되면 얕은복사(Shallow Clone)가 이루어진다.

예를 들어, a객체가 있고 b 객체가 있을 때 b=a라고 주입하고 a 값을 변경하여도 우리는 b는 기존 a값을 가지고 있을거라 생각한다.

하지만 b도 변경된 a값과 동일하게 변경되게 된다.

따라서 자바스크립트에서 객체의 값을 복사할 때는 깊은 복사(Deep Clone)이 되도록 해주어야 한다.

b = JSON.parse(JSON.stringify(a))

와 같이 JSON 객체의 메소드를 이용하여 깊은 복사가 되게끔 해주자.

JSON.stringify는 자바스크립트 객체를 먼저 JSON문자열로 변환시키고 JSON.parse는 JSON문자열을 자바스크립트 객체로 변환시킨다.

JSON문자열로 변환했다가 다시 객체로 변환하기에 기존 객체에 대한 참조가 사라져 깊은 복사가 이루어지게 된다.

반응형
반응형

text 타입으로 되어 있는 컬럼에 데이터를 insert하려고 하자 다음과 같은 에러가 발생하였다.

Data truncation: Data too long for column

보통 텍스트형태의 데이터를 넣어봤자 500자 이내였기 때문에 이런 경우를 접해보지 못했는데 이번에 경험해보고 MYSQL의 text타입이 몇 글자 제한인지 알게 되었다.

TINYTEXT
- 범위 : 최대 255 글자

TEXT
- 범위 : 최대 65535 글자

MEDIUMTEXT
- 범위 : 최대 16777215 글자

LONGTEXT
- 범위 : 최대 4294967295 글자

65535글자면 왠만한 텍스트 데이터는 다 커버칠 것 같다.....LONGTEXT로 컬럼 type을 변경하여 처리하였다.

Solution => column type : TEXT -> LONGTEXT

반응형
반응형

자바스크립트로 날짜 처리를 하다가 처음 알게 된 사실이 있어 포스팅 해본다.

var date = new Date();
//Fri Sep 25 2020 17:08:38 GMT+0900 (대한민국 표준시) {}

var month = date.getMonth() 
// 당연히 month 는 9일거라고 예상하지만....8이나온다.

이유는 다음과 같다.

Definition and Usage
The getMonth() method returns the month (from 0 to 11) for the specified date, according to local time.
Note: January is 0, February is 1, and so on.

ref : www.w3schools.com/jsref/jsref_getmonth.asp

위의 문서를 보면 알겠지만 자바스크립트에서 getMonth는 0~11까지의 값을 반환한다.

다시말해 1월이면 0을 반환하고 2월이면 1을 반환하며 12월이면 11을 반환한다.

따라서 getMonth()로 달을 뽑아 사용할 때는 date.getMonth() + 1을 해주어야 정확한 값이 된다.

 

 

 

반응형
반응형

for passing Parent pass data to child, child component shoud set props and binding name 

Parents html

if (selectedId == i) is not exist, when click button, all modal will be open

 <tr v-for="(item, i) in adList">
     <td>{{ item.id }}</td>
     <td>{{ item.adName }}</td>
     <td><button type="button" class="btn btn-primary" @click="createAdParameterModal(item, i)">파라미터확인</button>
         <modal-ad-param-info v-if="selectedId == i && showAdParameterModal" :item="item" v-on:close="closeAdParameterModal"></modal-ad-param-info>
     </td>
</tr>

Method

        createAdParameterModal : function(index) {
            this.selectedId = index;
            this.showAdParameterModal = true;
        },

 

Modal(modal-ad-param-info) props : item (in html code binding name)

let createAdParameterModalTpml = `
    <div class="modal_wrapper requestRanking">
       <div class="modal_body">
            <div class="modal_contents">
                <div>
                    <span v-for="datasource in item.dataSourceNames">{{ datasource }}<br></span>
                </div>
                <button class="btn btn-outline-danger" @click="closeModal">닫기</button>
            </div>
       </div>
    </div>
`;

export default {
    template: createAdParameterModalTpml,
    props: ['item'],
    methods: {
        closeModal: function () {
            this.$emit('close');
        }
    }
};

vue.js(vuejs) v-for안에서 modal창 띄우다가....삽질을 너무 마니해서 기록해본다.

반응형

+ Recent posts