공부/Java

·공부/Java
테스트 관련 강의를 들으면서 지금까지 테스트에 대해 너무 소홀히 했던 것이 아닌가 돌아보게 되었다. 그동안은 단순히 기능 개발에만 몰두해서 테스트는 나중에 직접 실행해보는 식으로 했었는데 언젠가 고쳐야지 생각만 하다가 이제서야 신경쓰게 되었다. 그런데 강의를 듣다보니까 좋은 테스트를 위한 코드가 좋은 설계를 위한 코드와 일맥상통한다는 점이 신기했다. 그러니까 테스트를 위한 코드를 작성하면 좋은 구조로 설계할 확률이 올라간다는 것이다. 그동안 공부했던 DDD와 추가로 알게된 헥사고날 아키텍처도 다른게 아니라 서로 연관이 있는 부분이 컸다.  도메인 위주로 리팩토링하기  위의 구조가 현재 프로젝트 구조이다.어느 정도 계층을 나눠서 구현하려 했지만 도메인별로 파악하기가 쉽지 않고, 실제로 코드로 들어가보면 도..
·공부/Java
도메인 모델을 구현하는 방법 중 자주 사용되는 것이 DB 엔티티 객체를 만들어 사용하는 방식이다. ORM을 통해 엔티티를 사용하면 UML 등으로 객체지향적으로 설계한 내용을 실제 구현체에 반영하기 쉽다. 하지만 객체를 이용하는 것에도 단점이 있다. 그것은 바로 수정하기 쉽다는 것이다. 무심코 Setter를 만들어버리면 메서드 하나만 호출하면 값을 쉽게 바꿀 수 있기 때문에 원치 않는 결과를 초래할 수 있다. 나도 전부터 여러 프로젝트를 진행하면서 무심코 Setter를 만들어 엔티티의 값을 수정하곤 했는데 이번에는 필요한 부분만 메서드로 따로 만들어 리팩토링 하기로 했다.  Badge 엔티티@Setter@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@..
·공부/Java
이전에 문자열로 된 클래스를 사용자로부터 받아서 내부의 메서드를 실행시키는 로직을 구현한 적이 있다. 그때는 파라미터도 없고, 단순 메서드 내부의 로직만 실행하도록 하는 것이 전부였는데, 이번 프로젝트에서는 코딩 테스트 풀이를 위한 메서드 실행이 목적이기 때문에 파라미터를 받는 것이 필수이다. 그런데 여기서 발생하는 문제는 파라미터 개수가 불분명하고, 문자열로 된 타입을 어떻게 실제 타입으로 변경할 것인가였다. 며칠간 고민하며 개발해 본 결과 다음 방법으로 원하던 목적을 이룰 수 있었다.  흐름 알아보기 먼저, 클라이언트에서 위와 같이 문제 번호와 작성한 코드 내용을 서버로 요청하면 컨트롤러에서 이를 처리하게 된다. 해당 컨트롤러에서는 다음 서비스를 호출하여 유저의 풀이 코드를 실행한다. @Slf4j@R..
·공부/Java
이번에 새 팀프로젝트로 코팅 테스트 문제 풀이를 할 수 있는 사이트를 만들어보기로 했다. 그래서 문자열로 받은 코드를 어떻게 실행할까 고민하고 찾아보다가 컴파일러 API를 통해 동적으로 코드를 컴파일할 수 있다는 것을 알았다. 이후에는 자바 리플렉션 기능을 이용해서 동적으로 클래스를 불러오는데 이 부분은 내가 평소에 자주 접하지 못했던 내용이라 흥미로웠다. 실행 과정 https://openjdk.org/groups/compiler/guide/compilerAPI.html Draft: Java™ Compiler APIJava™ Compiler API The Java compiler framework (javax.tools) is an API (Application Program Interface) for ..
·공부/Java
private static void quickSort(int[] arr, int start, int end) { if (start > end) return; int pivot = end, left = start, right = end - 1; while (left arr[left]) left++; while (right >= 0 && arr[pivot]  지금까지 사고력을 요구하는 코딩 테스트 문제만 풀고 단순 자료구조나 정렬 알고리즘을 직접 구현해본적이 없는 것 같아서 앞으로 하나씩 직접 구현해보기로 했다. 설명은 글로는 이해하기 힘들어서 유튜브에 여러 강의 영상이 있으니 참고하면 된다.처음에는 나도 잘 이해가 안 되다가 계속 보다보니 어떤 방..
·공부/Java
이전에 살펴보았던 프록시 패턴에서는 원하는 클래스나 인터페이스마다 프록시 클래스를 만들어주어야 하는 문제가 있었다. 100곳에서 프록시를 사용한다면 프록시 클래스를 100개 만들어주어야 한다는 것이다. 이 문제가 가장 큰 걸림돌이었는데 JDK 동적 프록시를 이용하면 이 문제를 해결할 수 있다. 참고로 JDK 동적 프록시는 자바 리플렉션을 사용하므로 클래스 메타 데이터를 가지고 동작한다.  동적 프록시 사용하기 이번에 구현할 내용은 원하는 문자열을 ===========로 감싸서 화면에 출력하는 것이다. public interface MyTextInterface { void print(String text);} 원하는 내용을 받을 메서드를 정의해 놓았다. @Slf4jpublic class MyTextI..
megamaker
'공부/Java' 카테고리의 글 목록