Dev/Backend 108

카운트 증가 로직 성능 향상을 위한 방법

각각의 요청마다 조회 수나 노출 수 등을 증가시켜야 한다면 어떻게 처리하는 것이 좋을까? 단순하게는 요청이 올때마다 +1씩 업데이트를 해주면 된다. 하지만 대량의 트래픽이 발생되는 환경에서 매 번 많은 비용이 소모되는 디비 연결과 update가 이루어진다면 부하를 감당하지 못 해 장애로 연결될 것 이 뻔하다. 개선을 위한 방법 중 하나는, 로컬 메모리로 매 번 요청되는 카운트 증가를 관리하고 일정시간마다 한 번 씩 모아서 db에 update하는 방법이다. 참고용으로 코드를 적어둔다. 흐름 카운트 증가 요청 시 매번 countMap에 누적 (CountService.addReadCount) 매 5초마다 countMap의 누적 카운트를 DB로 업데이트 (ScheduledTasks.addCountInDb) pu..

Dev/Backend 2019.09.26

[Java/ Intellij] 스트림 디버깅(Stream debugging) 쉽게 하기

출처 : Java Stream Debugger - Plugins | JetBrains Stream으로 개발하다보면 연산과정에서 데이터들이 어떻게 변하는지 한눈에 보고 싶을 때가 있다. 이럴때 이 debugger plugin이 큰 도움이 된다. 자세한 설명은 위의 링크에서 확인! 자 그럼 사용해보자. (2017.03 버전부터는 기본 설치되어 있다고 하니 바로 디버거를 실행하여 보자.) 1. 이렇게 stream 위치에 breakpoint를 설정해주고 debug run 실행(Control + Shift + D) 2. 아래의 아이콘(Trace Current Stream Chain)을 눌러보자. 참고) 디버거에서 아래의 아이콘이 보이지 않는다면 Find Action… (Command + Shift + A) > P..

Dev/Backend 2019.08.13

[jackson] json serialize 만 ignore 하고 싶다면?

필드에 @JsonIgnore 어노테이션을 사용하여 코딩하다보면 항상 마주하게 되는 문제점이 있다. 바로 deserialize시 데이터 저장이 안된다는 점... 이게 다 '필드'에 @JsonIgnore를 설정하면 getter, setter에 모두 적용되어 발생하는 문제인데.. 그럼 왜 필드에 사용하느냐? 아마 대부분 lombok을 사용하니까 그렇게 쓰지 않을까 싶다.. 여튼 원론적으로.. 직렬화(getter)/ 역직렬화(setter) 시 원하는 범위에만 @JsonIgnore를 적용하고 싶으면 그 부분에만 사용해주면 된다는 점! 한마디로.. @JsonIgnore/ @JsonProperty를 getter/setter에 사용하거나 @JsonProperty access 범위를 필드에 지정하면 된다. 물론 이런 커..

Dev/Backend 2019.01.25

[jackson] json serialize 시 상위클래스 필드 무시하기

rest api response로 객체를 json으로 변환하는데 가끔 상속받은 객체의 필드명과 다르게 반환해야 하는 경우들이 있다. 이런 경우 쓸 수 있는 팁. @JsonIgnore 활용 getter method 생성. public class SuperClass implements Serializable { private static final long serialVersionUID = -4657230387423033313L; protected String superA; protected String superB; public String getSuperA() { return superA; } public void setSuperA(String superA) { this.superA = superA; }..

Dev/Backend 2019.01.15

[spring - mybatis tip] MyBatis(iBatis)에서 Java Enum code custom typeHandler 사용하기

요즘에야 JPA - Hibernate를 많이 쓰는 추세라 이런 고민은 안하겠지만.. 프로젝트는 spring - mybatis기반이고.. 객체 지향 설계를 하다보니 enum들은 많아지고 그렇다고 mybatis에서 기본 제공되는 EnumTypeHandler를 쓰자니 DB에 저장되는 값이 커지고.. 뭐 그래서 암튼 enum 요소에 매핑되는 code값들을 db에 넣고 싶은데 이놈들을 코드값으로 넣고 빼고 하는건.. 아무래도 customizing이 필요함. 사용법은 아래처럼.. MediaEnumUtil.javapublic class MediaEnumUtils { public static T getCodeEnum(Class enumClass, String code) { return EnumSet.allOf(enum..

Dev/Backend 2017.07.06

[Java Test Tip] Assertj 로 좀 더 직관적인 테스트설계를 하자!

AssertJ란? java test를 위해 좀 더 풍부한 문법을 제공하고 메서드 체이닝을 통해 직관적인 테스트 흐름을 작성할 수 있도록 개발된 오픈소스 라이브러리이다. 최근 junit에 필수로 사용되고 있는 추세이다. 공식홈페이지http://joel-costigliola.github.io/assertj/ maven org.assertj assertj-core 3.8.0 test gradletestCompile 'org.assertj:assertj-core:3.8.0' 실사용예 - 공식홈페이지에서 발췌. // entry point for all assertThat methods and utility methods (e.g. entry) import static org.assertj.core.api.Asse..

Dev/Backend 2017.06.26

[Java Test Tip] JsonPath 로 더 쉽게 테스트하자.

JsonPath란?json 데이터를 쉽게 처리할 수 있도록 표현식 제공. 공식페이지https://github.com/json-path/JsonPath 사용법 테스트 페이지http://jsonpath.herokuapp.com/ maven com.jayway.jsonpath json-path 2.2.0 실사용예@Test public void testMethodArgumentNotValid() throws Exception { mockMvc.perform(post("/test/method-argument").content("{}").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$...

Dev/Backend 2017.06.26

spring cron scheduler 표현식 양식 및 예제

스케쥴러 cron 양식 초 0-59 , - * / 분 0-59 , - * / 시 0-23 , - * / 일 1-31 , - * ? / L W월 1-12 or JAN-DEC , - * / 요일 1-7 or SUN-SAT , - * ? / L # 년(옵션) 1970-2099 , - * /* : 모든 값? : 특정 값 없음- : 범위 지정에 사용, : 여러 값 지정 구분에 사용/ : 초기값과 증가치 설정에 사용L : 지정할 수 있는 범위의 마지막 값W : 월~금요일 또는 가장 가까운 월/금요일# : 몇 번째 무슨 요일 2#1 => 첫 번째 월요일 예제) Expression Meaning 초 분 시 일 월 주(년) "0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00 "0 15 10 ? * *..

Dev/Backend 2017.01.06

[Spring Tip] controller에서 @RequstBody, @RequestHeader 를 같이 사용해보자

스프링 사용하다가... controller에서 이렇게 선언해보았다... public TestDTO businessTest(@RequestBody TestDTO dto2, @RequestHeader(value="api-key") String key) throws Exception { 안된다.. ㅋㅋ 대부분 controller에 @RestController 가 선언되어 있을텐데 내부에 @ResponseBody를 포함하고 있다. @ResponseBody 사용시에는 @RequestBody와 @RequestHeader 를 혼용하여 사용할 수 없다는군.. 그래서 해결법은 @RequestMapping("/something") public ResponseEntity handle(HttpEntity requestEnti..

Dev/Backend 2016.09.20