이 상우(prostars)http://prostars.net

2022-04-18
요즘 라이브 서비스의 레거시 코드 리팩터링을 하고 있다. 흔히 가변 상태를 관리하는 Context 클래스가 레거시 코드에 있는 건 새삼스럽지 않았지만, 과도하게 사용하고 있어서 정리가 필요했다. 가변 상태 Context 사용 시 문제점 가변 상태를 가지는 Context 클래스가 2, 3개도 도 아니고 10개쯤 되면 과하다고 생각한다. 이렇게 많은 Context 클래스들이 서로 물고 물리는 종속성을 가지고 각기 다른 클래스에 넘기고, 넘겨받고, 가변 Context의 레퍼런스가 다양한 함수들로 넘겨져 전역 변수처럼 여기저기서 사용되면서 어딘가에서 A가 set을 하고 다른 곳에서는 B가 get을 하는 상황은 코드를 매우 읽기 어렵게 만들었다. 읽기 어렵다는 것은 Context를 수정할 때, 사용처를 모두 추적하는 것이 어렵고, 문제 발생 시 디버깅 역시 어렵다는 것이다.   다른 것보다 이걸 먼저 해결하기로 했다. 이 Context 클래스를 정리하는 리팩터링을 점진적으로 진행하여 총 10개에서 6개를 삭제하고 2개는 사이즈를 많이 줄였다. 프로덕션 코드에서 총 568라인을 삭제했다. 당연히 기능에 변화는 없다. Context를 정리하는 리팩터링이 일단락되어 ...
2021-12-13
자바 객체를 영속화하는 방법의 하나로 자바 직렬화를 사용할 수 있다. 단순하게는 Serializable 인터페이스를 구현하거나 더 확장성 있는 방법으로는 Externalizable 인터페이스를 구현하는 것을 선택할 수 있고, 자바 직렬화에 종속되지 않는 다른 방법을 선택할 수도 있다. 일단, Serializable 인터페이스를 구현한 클래스의 인스턴스가 외부 저장소에 영속화되면 호환성을 유지하면서 해당 클래스의 필드를 수정하기는 어렵다. ( https://docs.oracle.com/en/java/javase/11/docs/specs/serialization/version.html...
2020-05-07
이전 포스팅 에서 이어지는 내용이다. 전체 프로젝트는 여기 에서 받을 수 있다. 이번에는 리모트 디버그에 대해서 정리할 것이다. 공식 문서 에도 소개가 잘 되어 있지만, 이 문서도 보고 바로 따라하기에는 좀 어렵다. 여기서 정리할 내용이다. Docker Compose 설정 GDB 설정 Remote Debug via GDB/gdbserver Use Remote GDB Server Use GDB Remote Debug GDB Server로 Target Process를 실행 Target Process를 실행 후에 GDB Server를 해당 PID로 Attach Dockerfile, docker-compose.yml 그리고 CMake의 build type, compile debug option, release option과 같은 세부 사항이나 GDB Server의 옵션 등과 기타 디버그 설정 등도 여기서 모두 설명하면 너무 길어지므로 생략하고, 리모트 디버그 연동만 정리하겠다. 이전 포스팅에서 Debugger 설정을 다음과 같은 상태로 두고 넘어갔었다....
2020-04-23
자바로 개발된 프로젝트를 유지 보수하다 보면 Object Serialization, Deserialization이 사용된 코드를 흔하게 볼 수 있다. 간단하게 Serializable 인터페이스를 구현했거나 Externalizable 인터페이스를 구현해서 JSON 등의 다른 포맷으로 영속화를 시켰는지는 여기서 중요하지 않다. serialVersionUID를 명시적으로 정의하지 않고 생략했다면, 모두 동일한 문제를 가지고 있다.   문제는 아래와 같은 상황에서 발생한다. A 객체를 직렬화하여 Redis나 DB 등 외부에 저장하고, 저장된 값을 A 객체로 역직렬화하여 사용하고 있다....
2020-04-14
게으름이 이렇게 무섭다. 이걸 포스팅하겠다고 메모해 놓은 지 반년이 지났다. (이렇게 밀린 메모가 더 있다는 건 비밀이다.) 서버 개발자로 일을 하다 보면 Linux 환경만 지원하는 서버를 유지보수 해야 할 수도 있다. 아마 epoll을 사용한 서버일 것이다. 어떤 개발 환경으로 세팅이 되어 있을지는 모르겠지만, 해당 서버에 직접 들어가서 vi로 작업을 하고 make로 빌드하고 gdb로 디버깅을 해도 된다. 또는, Docker로 같은 Linux로 개발 환경을 만들고 visual studio code를 리모트로 연동해도 된다. 방법은 다양하다. 하지만, 나는 에디터나 터미널에서 vi로 작업하고 make를 실행하고 git 커맨드를 직접 사용하는 진성 개발자가 아니다. 편리한 IDE를 선호한다. vi의 손맛을 좋아하며 코딩하던 나의 멋진 취향은 Sun의 Enterprises 3500에서 개발할 때까지였다. 여기서 소개하는 방법은 CLion과 Docker를 연동하는 방법이다....
2019-08-05
이전 포스팅 ‘ 테스트 용이성(Testability) 향상을 위한 DI(Dependency Injection) ’에서 이어지는 내용이다. 종속성 문제 테스트 코드 없이 개발할 때는 잘 인지하지 못하다가 테스트 코드를 넣으려고 할 때 만나는 문제 중 하나로 종속성 문제가 있다. 테스트 환경에서 특정 객체 하나를 생성하기 위해서 너무 많은 객체가 필요해지는 상황과 특정 객체가 내부적으로 다른 객체를 직접 생성하는 상황이 그것이다. 이런 상황은 몇 가지 방법으로 개선을 할 수 있다....
2018-05-02
최근에 Java 를 실무에 사용하면서 JShell 이 있어서 참 다행이라고 생각하고 있다. IntelliJ 가 JShell Console 이라는 기능으로 툴 안에서 JShell 을 연동해주고 있어서 더 편리하게 사용하고 있는데 이번 글에서는 JShell 에 대한 간단한 소개와 유용함을 알아보자. 이 글은 macOS 를 기준으로 하며 다음의 내용을 다룬다. 1. JShell 에 대한 간단한 소개 2. Java 8, 9, 10 를 손쉽게 전환하면서 사용하는 방법 3. IntelliJ 의 JShell Console 사용하기 4. IntelliJ 의 JShell Console 에서 사용자 클래스 사용하기...
2018-04-03
지난 글 에서 의존성 주입(Dependency Injection)에 대한 이야기를 했었다. 이번 글에서는 다른 방식의 의존성 주입인 케이크 패턴을 소개한다. 스칼라의 케이크 패턴에 대한 자세한 내용은 여기 를 참고 바란다. 케이크 패턴 스칼라의 케이크 패턴을 자바에서 사용해보자. 케이크 패턴은 의존성 주입의 한 방법이다. 자바 8에서는 인터페이스가 구현 코드를 담은 디폴트 메소드를 가질 수 있게 되었다. 이 디폴트 메소드를 이용하면 스칼라의 trait 와 비슷해진다. 비록 trait 의 셀프 타입을 사용할 수는 없지만, 어차피 자바는 스칼라처럼 with 를 사용하여 객체 생성 단계에 와이어링을 할 수 없으니 상관없다....
2018-04-02
이전 포스팅 BDD(Behaviour-Driven Development)에 대한 간략한 정리에서 같이 다루려고 했던 내용이다. 하나의 클래스를 테스트하기 위해서는 그 클래스가 사용하는 다른 클래스의 실제 구현이 필요하거나 테스트 대상 클래스가 사용하는 데이터베이스 등에 대한 외부 환경이 구성되어 있어야 하는 경우가 있다. 하지만 테스트 환경에서 이를 모두 구성하는 것은 현실적으로 쉽지 않고, 테스트 실패에 대한 원인이 해당 클래스만의 문제인지, 아니면 관련된 다른 클래스의 문제인지를 찾기가 무척 어렵다. 즉, 테스트 대상 클래스의 기능만 한정 지어 테스트를 수행하기 어려운 경우가 많다. 테스트 용이성이란 말 그대로 테스트 대상을 얼마나 테스트하기 쉬운가에 대한 척도이다. 테스트 대상이 얼마나 복잡한가? 얼마나 결합도가 높은가? 등 몇 가지 내용이 있지만, 이번 글에서는 테스트 용이성에서 결합도와 Mocking 에 대한 내용만을 간단히, 이를 개선하기 위해 Dependency Injection 이 어떻게 사용되는지에 대해 설명한다. 이 글에서 Mocking 은 Mocking 객체를 의미하며 이를 간단히 말하면 실제 객체를 흉내내는 가짜 객체를 하나 만드는...
2018-03-26
단위 테스트는 단순히 테스트 코드가 아니라 리펙토링을 위한 안전망이며 코드를 설명하는 문서 역할도 한다....
더보기