본문 바로가기

반응형

분류 전체보기

(43)
Spark 개발 환경 구축하기 - Scala, IntelliJ, SBT Spark 애플리케이션을 개발에는 크게 Scala 또는 Python을 사용할 수 있다. 기존에 자바로 개발을 주로 해왔던 개발자라면 Scala를 선호할텐데 개발 환경 세팅을 할때 참조할만한 자료가 많지 않아 직접 프로젝트 세팅을 하며 정리해봤다. 시작하기에 앞서 세 가지 선결 사항이 있다. Spark 설치, 환경변수 설정 Scala 설치 IntelliJ Scala plugin 설치 설치 방법은 구글에서 쉽게 찾을 수 있다. 본 게시물 최하단에도 참고 링크를 걸어두었다. 1. 프로젝트 생성 이제 Scala, Spark, IntelliJ Scala plugin 설치는 모두 되어있다고 가정하고 IntelliJ 새프로젝트를 생성해보자. build tool을 선택하면 되는데 sbt가 recommended라고 되어..
Spring Batch - Paging 처리시 주의점 스프링배치의 ItemReader 중에서는 Paging 처리를 지원하는 것들이 있다. 대표적으로 JdbcPagingItemReader와 최근에 추가된 것으로 보이는 JpaPagingItemReader가 있다. 이외에 Spring Data repository를 사용할 수 있게 해주는 RepositoryItemReader도 Paging처리를 지원한다. 해당 ItemReader들을 활용해 Paging 처리를 할시, 데이터가 Skip현상이 발생할 수 있다. 아래와 같이 유저 상태가 '01'인 데이터들을 읽어들여 '02'로 업데이트 해주는 배치 애플리케이션이 있다고 가정해보자. 실제로는 select 쿼리에 페이징 처리도 들어가게 된다. 이렇게 페이징 처리를 했을때의 문제는 where 절에 조건 컬럼을 업데이트한다는..
레거시 코드 개선기(feat. 스프링 부트, JPA) 레거시를 버려야 할 때 오랜 시간 문제없이 돌아가는 레거시 코드는 낡았지만 돈을 벌어다 주는 고마운 존재다. 물론 낡을대로 낡은 레거시 코드는 볼때마다 갈아엎고 싶은 생각이 가득하지만, 잘 돌아가는 코드를 뒤엎기에는 개발자는 할 일이 너무 많다. 하지만 계속 운영되기만 하면 될게 아니라 요구 사항이 계속 추가되거나 수정되어야 하는 경우가 바로 분명한 동기가 생기는 시점이다. 깔끔하고 확장 및 수정이 쉬운, 세련된 코드로 탈바꿈 할 때가 온 것이다. 문제점 파악 개선 대상 서비스는 '오늘의 팁'이라는 판매자용 서비스다. 판매자들이 백오피스에 접속했을때 지난주 유입 고객들이 얼마나 되며, 이번주의 인기 카테고리는 무엇인지 등 판매 활동 개선에 필요한 팁들을 제공한다. 문제는 아직 새로운 팁 종류를 추가하거나..
목적 조직에서 개발자로 살아남기 목적 조직에서 2년 간을 일하며 느꼈던 바를 기록하고자 한다. 당연히 목적 조직이냐 기능 조직이냐에 대한 답을 내리는 등의 담론을 다루고자 함은 아니며 목적 조직에 몸담으며 느낀 개발자의 역할에 대해 이야기려고 한다. 또한, 우연히 다른 블로거분이 기획자 관점에서 쓰신 개발팀과 개발팀장이 사라져야 하는 이유라는 글을 보았는데, 몇 가지는 동의하지만 몇 가지는 그렇지 않기에 이 글을 통해 반박해보고 싶다. 비즈니스 vs 시스템 기획자, 데이터분석가, 개발자로 구성되어 있는 조직에서의 2년을 요약해본다면 비즈니스 vs 시스템이라는 두 가지 목표의 충돌이었다. 이게 무슨 해괴한 소린가. 결국 회사 모든 조직의 목표는 돈을 버는 것인데 조직 내부에서 추구하는 바가 다를 수가 있을까? (혹은 달라서야 되겠는가?)..
Springboot yaml 파일에 List 세팅하기 yaml property에 list 형식의 데이터를 세팅해줘야 되는 경우가 있다. 이런 경우 두 가지 방식이 있는데, 먼저 아래와 같이 "- "(dash and space) 문법을 활용하면 자바에서 Collection 필드에 주입할 수 있다. my: servers: - dev.example.com - another.example.com 그러면 자바 코드에서는 아래와 같이 Collection 필드에 주입된다. dash 뒤에 공백을 한 칸 줘야하는 것을 꼭 잊지말자.@ConfigurationProperty 말고 @Value를 사용할 수도 있는데, @ConfigurationProperty는 bulk injection이 되므로 데이터가 계층 구조일때 편의성이 있다. 반면 단일 필드를 사용할때는 @value가 더..
객체지향 의존 역전 원리(DIP) 제대로 알기 스프링+자바 코드를 보다 보면 흔하게 Service 인터페이스를 구현하고 있는 ServiceImpl 클래스 볼 수 있다. 물론 나도 컴퓨터공학 전공자로서 대학시절에 객체지향의 기본 원리에 대해서는 공부를 했지만 정작 실무를 접한 주니어 때는 왜 꼭 인터페이스-구현체 구조를 만들어야 되는지 제대로 이해하지 못했다. 물론, 인터페이스가 무엇인지는 알고 있었다. 그러니까 Dog도 Animal이고 Cat도 Animal이니까 결국 Animal로 묶어서 추상화할 수 있고 인터페이스로 공통된 규약을 정의할 수 있다는 개념이 아닌가. 하지만 인터페이스와 구현체가 1:1인 경우 딱히 다형성의 이점을 활용하는 것도 아니다. 이런 경우 꼭 인터페이스를 사용할 필요가 있겠냐는 생각이 들었고 실제 그렇게(인터페이스가 필요 없다..
Redis의 다양한 구성을 빠르게 따라해보자 그동안은 상용 환경에서 in-memory cache를 주로 사용해왔다. 하지만 서버(인스턴스) 수가 많아질 경우에는 각 로컬 서버에 캐싱된 데이터가 전파되지 않으므로 히트율은 비약적으로 떨어지게 된다. 최근에 런칭한 서비스도 점차 트래픽이 많아지고 있어 scale-out을 논의하게 됐는데, 자연스럽게 remote cache 또한 구성하게 되었다. Cluster와 Replication 사랑받는 오픈소스라면 HA(High Availibility)를 위한 여러가지 기술을 지원한다. Redis도 Cluster, Replica, Sentinel을 활용한 구성으로 HA를 보장한다. Cluster는 여러 노드에 데이터를 분산시키는 샤딩 기술이며 Replication은 데이터 유실을 최소화하기 위한 복사본 이중화를 뜻..
스프링 배치 대용량데이터 처리 성능 개선기 [1편] 요구사항 혜택 고객 선정 모델을 통해 혜택 대상 고객들을 선정하고, 해당 고객들에게 쿠폰을 발급해주는 시스템을 구축해야 했다. 여기서 나는 일배치를 통해 집계된 대상 고객들에게 쿠폰을 발급하는 시스템을 설계하고 개발하기로 했다. 그런데 문제는 일별로 발급대상 데이터의 건수가 수십-수백만까지 예상되며 이를 3시간 내에 처리해야한다는 것이었다. 알던 이전에 구축해놓은 스프링 배치 서버가 있어 이를 활용해보기로 했고 전반적인 시스템 구조부터 그려봤다. Overall System Architecture 스프링 배치 관리/모니터링 도구로는 젠킨스를 활용하고 있다. 배치가 실행되면 대상고객이 집계되어있는 DB에서 타겟을 가져와서 쿠폰발급 서버에 1건 단위로 발급을 요청한다 발급 결과(쿠폰번호)를 받으면 데이터 집계..