본문 바로가기

반응형

IT/개발지식

(21)
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 절에 조건 컬럼을 업데이트한다는..
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은 데이터 유실을 최소화하기 위한 복사본 이중화를 뜻..
Git commit 이력을 깔끔하게 관리하는 2가지 방법 Git을 처음 쓸때는 작업 이력을 저장하는 개념 정도로 commit을 이해하고 사용했었다. 그러다보니 commit 이력이 지저분해졌고, 다른 개발자들이 내 코드를 commit 단위로 리뷰하기 어려웠다. 또한 commit 단위로 수정 이력을 추적하는 것도 불가능해져 비로소 commit을 깔끔하게 관리하는데 공을 들이기 시작했다. 내가 주로 활용하는 방법은 2가지가 있다. 1. git stash 현재 작업중인 파일의 snapshot을 스테이징 영역에 잠시 보관해두는 명령이다. 개인적으로는 현재 브랜치의 작업이 완료되지 않은 상태에서 잠시 저장하고 다른 브랜치로 넘어가야 하는 상황에 주로 쓴다. 처음에는 이 명령어를 사용하면서도 혹시나 스테이징 영역이 날아가버리지는 않을지 불안하기도 했지만 다행히 아직까지 그..
JPA의 핵심 - 영속성 컨텍스트 훑어보기 JPA를 처음 접했던 몇 년전에는 ORM이라는 개념 자체가 낯설었다. 엔티티 정의후 연관 관계만 잘 매핑하면 소스에 직접 쿼리를 쓸 일이 현저히 줄어들어 그것만으로도 훌륭하다고 생각했는데, 알고보니 주인공은 영속성 컨텍스트였다. 그만큼 영속성 컨텍스트는 JPA를 사용한다고 하면 반드시 알아야하기 때문에 핵심 개념을 중심으로 정리해보았다. Entity Manager 엔티티는 말그대로 엔티티의 CRUD에 관여하며 엔티티와 관련된 모든 일을 처리한다. 자바 ORM 표준 JPA 프로그래밍이라는 책에서 김영한님은 엔티티 매니저를 가상의 데이터베이스로 생각하자고 하셨다. 실제 DB에 쿼리가 날아가기 전에, 엔티티와 관련된 모든 생성, 조회, 수정, 제거 작업은 엔티티 매니저를 거치게 된다. 스프링에 익숙하신 분이라..
DataJpaTest를 활용한 테스트 지난 포스팅에서는 Mockito를 활용하여 Service 객체가 적절하게 내부 객체를 호출하는지를 알아보는 테스트를 진행했었다. 그 과정에서 Mock 객체를 활용한 이유는 테스트의 주 관심 대상이 아닌 객체는 올바르게 동작한다는 가정을 하기 위해서였는데, 이제 해당 Mock 객체가 올바르게 동작했는지 테스트해보자. 마찬가지로 회의실 예약 예제를 활용해보자. 이번 테스트의 중점은 Spring Data JPA의 동작이다. 즉, 데이터가 실제로 올바르게 들어가고 나오는지를 보면 된다. 코드를 보자. 간단하다. testRetrieveRooms 메서드를 보면, 먼저 "A"라는 회의실을 생성해 roomRepository에 저장한다. 저장된 모든 회의실 중 첫번째 회의실을 꺼내온 다음, 회의실의 이름이 위에서 저장했..