전체 글

전체 글

    Gradle Repository를 변경해보자

    발단 신규 Spring Batch 프로젝트 구동을 위해 서버를 구축 중이었고, 먼저 개발환경(dev enviroment)을 세팅하고 있었다. 서버에서 젠킨스를 띄우고 빌드를 위한 플러그인들을 설치하려는데 초장부터 문제가 생겼다. 사내의 개발 환경은 외부 인터넷망으로의 접근이 막혀 있었던 것이다. 그래도 여기까지는 다른 서버에서 플러그인 파일을 복사해오거나 번거럽더라도 http://plugins.jenkins.io에서 아카이브 파일을 직접 다운로드할 수도 있으니 괜찮았다. 그런데, 플러그인 설치 작업을 마치고 빌드를 눌러보니 다음과 같은 오류가 발생했다. 원격 저장소 의존성 프로젝트 빌드시 gradle wrapper를 사용하고 있는데, 이 gradle wrapper는 특정 저장소에서 제공하는 gradle ..

    JPA의 핵심 - 영속성 컨텍스트 훑어보기

    JPA를 처음 접했던 몇 년전에는 ORM이라는 개념 자체가 낯설었다. 엔티티 정의후 연관 관계만 잘 매핑하면 소스에 직접 쿼리를 쓸 일이 현저히 줄어들어 그것만으로도 훌륭하다고 생각했는데, 알고보니 주인공은 영속성 컨텍스트였다. 그만큼 영속성 컨텍스트는 JPA를 사용한다고 하면 반드시 알아야하기 때문에 핵심 개념을 중심으로 정리해보았다. Entity Manager 엔티티는 말그대로 엔티티의 CRUD에 관여하며 엔티티와 관련된 모든 일을 처리한다. 자바 ORM 표준 JPA 프로그래밍이라는 책에서 김영한님은 엔티티 매니저를 가상의 데이터베이스로 생각하자고 하셨다. 실제 DB에 쿼리가 날아가기 전에, 엔티티와 관련된 모든 생성, 조회, 수정, 제거 작업은 엔티티 매니저를 거치게 된다. 스프링에 익숙하신 분이라..

    자바 웹 애플리케이션 Out of memory 오류 해결기

    발단 어느날 새벽 4시경 잠이 오지 않아서 유투브를 보고 있는데, 평소에는 곤히 자고있을 시간이던 그 타이밍에 관제실로부터 한 통의 쪽지를 받게 되었다. 내가 운영 중인 서비스 WAS중 하나가 CPU 사용률이 90%가 넘게 올라갔으니 확인해달라는 내용이었다. 다행히도 검증계 WAS였지만 지속적으로 모니터링 알람이 송신되고 있는 것 같았으므로 즉시 조치를 취하겠다고 회신했다. 1차 원인 파악 보아하니 매일 새벽 2시에 돌고 있던 배치가 제대로 안돌았을 것 같았다. 이 배치는 그 날 사용할 데이터를 DB에서 읽어와 WAS 메모리에 올려놓는 작업을 수행하는데, 데이터양이 많아서 정상적으로 수행되도 몇 분이 소요된다. 그런데 DB 사용로그를 한번 보니 배치가 수행되는 딱 그 시간대에 사용량이 아래와 같이 튀고 ..

    당신이 SI를 떠나야하는 이유

    System Integration(SI). 네트웍, 하드웨어 및 소프트웨어 등 IT와 관련된 수많은 요소들을 결합시켜, 하나의 시스템으로서 함께 운영될 수 있도록 하는 사업을 의미한다.(나무위키 발췌). 쉽게 말해 돈을 받고 고객이 원하는 소프트웨어를 만들어주는 형태의 사업인데, 현재 대한민국 IT 시장에서 가장 많은 비중을 차지하는 사업이 바로 SI사업일 것이다. 그러나 동시에 SI지옥, 개발자들의 무덤이라는 오명 또한 가지고 있다. 나 또한 2년 가까이 이 SI 업계에서 몸담아봤고 현재 대한민국 SI산업에 대해 부정적인 시각을 가지고 있다. 하지만 SI 산업 자체를 부정하고 싶지는 않다. 수요가 확실한 사업이며 배울 수 있는 것이 분명 있다. 다만 적어도 당신이 개발자를 꿈꾸는 사람이라면, 기술에 대..

    DataJpaTest를 활용한 테스트

    지난 포스팅에서는 Mockito를 활용하여 Service 객체가 적절하게 내부 객체를 호출하는지를 알아보는 테스트를 진행했었다. 그 과정에서 Mock 객체를 활용한 이유는 테스트의 주 관심 대상이 아닌 객체는 올바르게 동작한다는 가정을 하기 위해서였는데, 이제 해당 Mock 객체가 올바르게 동작했는지 테스트해보자. 마찬가지로 회의실 예약 예제를 활용해보자. 이번 테스트의 중점은 Spring Data JPA의 동작이다. 즉, 데이터가 실제로 올바르게 들어가고 나오는지를 보면 된다. 코드를 보자. 간단하다. testRetrieveRooms 메서드를 보면, 먼저 "A"라는 회의실을 생성해 roomRepository에 저장한다. 저장된 모든 회의실 중 첫번째 회의실을 꺼내온 다음, 회의실의 이름이 위에서 저장했..