본문 바로가기
생각 정리

기본으로 돌아가자(feat. void method)

by 타태 2022. 3. 5.

 

 

 

2022.02.22 - [실전 공부/AWS&Docker&Linux] - [Docker] Layered jar를 이용한 스프링 부트 Docker build 최적화

 

[Docker] Layered jar를 이용한 스프링 부트 Docker build 최적화

스프링 부트 메이븐 플러그인 공식 문서 Spring Boot Maven Plugin Documentation While you may start your Spring Boot application very easily from your test (or test suite) itself, it may be desirable..

ktae23.tistory.com

 

 

때는 정식 입사 2~3개월차, 서비스 코드를 열어볼 수 있는 권한이 생긴지 얼마 안되었을 꼬꼬마였을 시절이다.

(지금은 꼬마 정도?)

 

6개월 장기 교육 과정에서 사용할 역량 평가 기능을 개발하게 되었고, 처음으로 많은 고민을 하며 코드를 작성했었다.

(시험 문제 풀고 문항별 점수, 정답률, 평균, 등수, 성장률 등등을 확인 할수 있음) 

 

지금보면 누가 내가 작성한 코드를 열어볼까봐 부끄러울 정도였고 언제고 꼭 다시 작성하고 싶다고 생각하고 있었다.

미리 핑계를 대자면 한달 정도 기간동안 개발을 하면서 일주일에 3번은 요구사항이 바뀐것 같다. 정말이지 처음부터 너무 매운맛을 본것 같다.

 

시간이 흘러 앞으로 현재 서비스 중인 어플리케이션을 개편하면서 해당 평가 기능은 다른 방식으로 다시 구현하기로 결정이 났다.

내가 작성한 코드는 폐기 될 예정이다.

 

처음으로 내가 개발한 코드의 생명주기를 함께하는구나 생각하니 기분이 묘했다.

사용자가 있는 서비스, 코드야 어쨌든 원하는 기능을 잘 동작하는 코드 그리고 앞으로 폐기 될 코드...

 

더 늦기전에 이 찝찝한 마음을 털어버리자 싶어 중첩 for문은 스트림으로, 절차적이고 조건이 주렁주렁 달린 if문은 메서드 분리로 가독성을 높였다.

 

이때 인텔리제이의 인텔리한 메서드 분리 기능을 적극 사용했는데 특정 조건일 경우 값을 넣어주는 메서드의 리턴값이 void였다.

public List<String> 메서드() {

    List<String> list = new ArrayList<>();
    
    if(isFirst()) {
            이런_메서드_1(list);
    }

    if(isSecond()) {
            이런_메서드_2(list);
    }

    private void 이런_메서드_1(List<String> list) {
        list.add("데이터1");
    }

    private void 이런_메서드_2(List<String> list) {
        list.add("데이터2");
    }

	return list;
}

 

음? 넣기만하고 다시 재할당 안하면 안되는거 아니야? 하고는 죄다 return으로 다시 받아서 넣었다.

생각해보면 지금까지 작성한 코드들의 대부분이 리턴을 받아 재할당 했던거 같다.

물건을 넘겨줬으니 다시 돌려 받아야 한다는 느낌으로 생각하고 있었다.

 

그래서 간단하게 플레인 코드를 작성하여 실행해봤다.

import java.util.ArrayList;
import java.util.List;

public class VoidMethodTest {

    List<String> memberTestList = new ArrayList<>();

    public List<String> getMemberTestList() {
        return memberTestList;
    }

    public List<String> testMethod() {
        return new ArrayList<>();
    }

    public void setTest(List<String> testStringList) {
        System.out.println("setTest call");
        testStringList.add("setTest");
    }

    public static void main(String[] args) {
        VoidMethodTest voidMethodTest = new VoidMethodTest();
        List<String> stringList = voidMethodTest.testMethod();
        voidMethodTest.setTest(stringList);
        System.out.println("stringList = " + stringList);
        
        voidMethodTest.setTest(voidMethodTest.getMemberTestList());
        System.out.println("voidMethodTest.getMemberTestList() = " + voidMethodTest.getMemberTestList());
        
    }
}

 

결과는 이렇게 나온다.

setTest call
stringList = [setTest]
setTest call
voidMethodTest.getMemberTestList() = [setTest]

 

이전에 짠 코드가 부끄럽다며 리팩터링 하고 싶다고, 요즘 클린코드, 객체지향의 사실과 오해, DDD 등의 책을 좀 읽고 있다고 내가 더 나아졌다고 착각하고 있었나보다.

인자로 넘기는 변수가 물건 넘기듯이 넘어다니는 것이 아니라 변수가 참조하고 있는 주소에 값이 저장 되는 것인데...

 

 

 

 


 

 

개발 공부를 시작할 때 주간 인프런에서 봤던 인터뷰가 기억난다.

개발 경력 40년 현역 개발자 김영보님의 인터뷰였고, 여기 이런 말이 나온다.

 

 

본질에 충실하십시오. 기본에 충실하십시오. 기초가 아닌 기본입니다. 기본을 조금 더 본질적으로 접근하시면 그러면 거기서부터 실력이 쌓일 것입니다. 너무 심플한가요? 그러나 그게 쉬운 일은 아닙니다. 

 

확실히 요즘 나는 너무 마음이 급했다.

PM 한 분, 프론트엔드 한 분, 그리고 나 이렇게 3명이서 신규 프로젝트 설계부터 개발, 배포, 운영까지 한 프로젝트를 끝냈고, 다음 프로젝트를 앞두고 있다. 

기존 서비스와 신규 서비스의 추가 요구사항 개발 및 운영/유지보수 그리고 기존 서비스 리뉴얼 프로젝트 설계 및 기술 공부를 병행하려니 과부하가 온다.

날고 기는 사람들 뒤를 빠르게 쫓으려 이력서에 한줄 적기 좋은 보여지는 것에만 치중한것 같다.

 

기본으로 돌아가자. 기초가 아닌 기본.

솔직히 지금 정보처리기사 취득 당시 공부한 네트워크, 운영체제 내용도, 멀티캠퍼스에서 배운 자바 메모리 구조와 JVM 동작 원리도 잘 기억이 안난다.

Spring, Spring boot, Spring Security, Spring Data Jpa, Docker, Kubernetes, AWS가 아닌

운영체제, TCP/IP, Network, Java, 알고리즘, 컴퓨터 사이언스를 공부해야겠다.

 

빠르게 세우고 한순간 무너지는 사상누각이 아닌 뼈대가 탄탄한 웰메이드가 되자.

 

반응형

댓글