프로젝트가 막바지에 이르고 있어서 요즘은 테스트를 진행하고 있는데, 지난 프로젝트(엑셀업로드를 통한 대량등록 성능 개선의 건)를 통해 대용량 데이터를 다루는 경우를 항상 염두에 둬야 한다는 것을 배웠기 때문에 이번에도 테스트데이터로 150만건 정도를 준비했다. 데이터를 150만건이나 만들려고 보니 프로그램으로 돌리는게 빠르겠다싶어서 대용량 더미데이터를 만들어주는 프로그램을 짰다. 그래서 그 데이터로 테스트를 하다가... out of memory(GC Overhead limit exceed)를 만났다. 대리님께 이 기능에서 out of memory가 발생한다고 말씀드렸더니 Jmap, Jhat으로 메모리 덤프 분석해서 원인을 찾아보라고 하셨다. Jmap과 Jhat을 처음 들어서 찾아보니 Jmap은 JVM 모..
대리님들이 자바8의 메서드 참조에 대해 말씀하시는걸 주워듣고 나도 이래저래 공부를 했는데 메서드 참조는 이해가 안 갔다. 그러다가 오늘 갑자기 깨달음을 얻어서 간단하게 정리해둔다. 메서드 참조는 말그대로 메서드를 참조하는 것이다. 그렇다면 메서드를 왜 참조하느냐? 이미 있는 메서드를 사용하기 위해서이다. public class Hello { private static final String HELLO = "안녕하세요!"; public String sayHello() { return HELLO; } public String sayHello(String name) { return name + "님, " + HELLO; } } 위와 같은 클래스가 있다고 해보자. 이름을 입력하면 이 이름을 이용해서 인삿말을 출..
외부 직원에게 사정상 vm 접근권한을 보내줄 때, 나는 따로 계정을 만든 뒤, /etc/sudoers에 등록하고 넘겨주면 되지 않나 했는데, 팀장님은 wheel 그룹을 주면 된다고 하셨다. 그래서 wheel 그룹을 찾아보니 /etc/sudoers에 이미 wheel 그룹이 정의되어 있어서 wheel 그룹을 주는 방법이 더 간단하겠다고 생각했다. 이때 wheel 그룹에 유저를 추가하는 명령어도 여러 가지가 있는 것 같은데 우선 팀장님이 알려주신 것과 더 찾아본 바 아래 두 가지와 같다. // 1. gpasswd -a [사용자계정] wheel // 2. usermod -aG wheel [사용자계정]
지금 개발중인 시스템에서 고민했던 문제를 여기에 정리해둔다. 현재 개발중인 내용은 기존의 시스템 A는 고도화하고 그 시스템에 새로운 B시스템을 붙여 만드는 것이다. 각 시스템의 관리자는 각 시스템만 조회할 수 있지만, 이 두 시스템을 모두 접속할 수 있는 마스터 계정이 있다. 이것이 첫번째 문제이고, 이 두 시스템이 공통으로 사용 가능한 기능이 있다는 것이 두번째 문제이다. 전체 관리자의 경우, 각 페이지에서 서로 다른 시스템으로 이동할 수 있는 링크가 있어서 이동할 수 있다. 하지만 이 링크는 현재 접속중인 시스템을 표시해야 한다. 문제는 header에서 이 링크를 표시하고, 공통으로 사용하는 기능의 페이지는 나눠지지 말고 파일 하나로만 존재해야 한다는 것이다. 아래와 같이 구현해야할 흐름을 정리할 수..
😃책에서 기억하고 싶은 내용을 써보세요 스스로 자꾸 물어보라. ‘내가 방금 한 일이 전체 시스템을 바꾸기 쉽게 만들었을까, 어렵게 만들었을까?’ 파일을 저장할 때마다 물어보라. 테스트를 쓸 때도, 버그를 수정할 때도 물어보라. 아무 실마리가 없을 경우 다음 두 가지를 해보라. 첫 번째로, 언제건 궁극의 ‘바꾸기 쉽게’라는 길을 선택한다. 두 번째는 이런 경우를 여러분의 직관을 발전시키는 기회로 삼으라는 것이다. 엔지니어링 일지에 현재 상황과 여러분의 선택, 그리고 변경 사항에 대한 추측을 정리해 둬라. 그리고 소스 코드에 이에 대한 표시를 남겨 둬라. 나중에 이 코드를 바꿔야 하는 시점이 왔을 때, 뒤를 돌아보고 자신에게 피드백을 줄 수 있을 것이다. 그러면 비슷한 갈림길에 다시 섰을 때 도움이 될 것이..
DispatcherServet은 HTTP 요청을 제일 앞에서 받아 적합한 컨트롤러로 요청을 넘겨주는 Front Controller의 역할을 한다. DispatcherServlet이 어떻게 동작하는지 보기 위해서는 그 클래스를 까보면 된다. (예전같았으면 인터넷 검색을 주로 했겠지만 스프링 자체가 실력있는 분들이 작성한 코드다보니 이런 분들이 작성한 코드를 보고 배우는 경험도 되고 직접 뜯어보는게 훨씬 기억에 잘 남아서 요즘은 공식문서를 보며 코드를 뜯어보고 있다.) 먼저 계층구조를 뜯어보면 위와 같다. 이제부터 살펴볼 DispatcherServlet은 FrameworkServlet을 상속하고 있다. FrameworkServlet은 WebApplicationContext를 멤버변수로 가지고 있다. publ..
😃책에서 기억하고 싶은 내용을 써보세요 쉬운 정답은 없다. 도구든, 언어든, 운영 체제든 최고의 해결 방안 같은 것은 없다. 오직 특정한 환경 조건들마다 가장 적절한 시스템들이 있을 뿐이다. 바로 이것이 실용주의가 필요한 이유다. 어떤 특정 기술에 매이면 안 된다. 개별 상황마다 그 상황에서 좋은 해결 방안을 고를 수 있도록 충분한 배경지식과 경험을 쌓아야 한다. “우리가 단지 돌을 자를지라도 언제나 대성당을 마음속에 그려야 한다.” 실용주의 프로그래머의 특징 얼리 어댑터 또는 새로운 것에 빨리 적응하는 사람 호기심 많은 사람 비판적인 사고의 소유자 현실주의자 다방면에 능숙한 사람 자신의 기예에 관심을 가지는 사람 문제를 고치기 위해 노력하라. 하지만 너무 오랫동안 노력하지는 말라. 기술에 뒤쳐지는 ..