주요글: 도커 시작하기
반응형

youtu.be/gd9aeUywGcM

 

반응형

프로그래밍 왕초식: if 조건 역으로 바꾸기

youtu.be/z4qE_IfSrD4

 

반응형

CodeMetrics 플러그인 소개: 복잡도 점수로 자극 받기

youtu.be/8NtKoANOezI

 

반응형

어제 이어 오늘도 사소하게 코드를 정리했다. 정리하기 전에 코드 형태는 다음과 같다.

if(obj.getData().equals("01") || obj.getData().equals("02") || obj.getData().equals("03")) {
    ....
}

문자열이 여러 값 중 하나인지 비교하는 코드이다. 이런 형태의 코드가 곳곳에 있어 어떻게 변경할까 고민하다가 SQL의 in 구문이 떠올라 다음과 같이 변경했다.

if ( Cond.str(obj.getData()).in("01", "02", "03") ) {
    ...
}

코틀린이었다면 확장 함수를 사용해서 더 간결하게 표현할 수 있었을텐데 하는 아쉬움이 살짝 들었지만 컴파일 속도를 생각하면 이것도 괜찮다.

다음처럼 여러 값이 모두 아닌지 비교하는 코드도 빈번하게 출현한다.

if( !obj.getData().contentEquals("01") && !obj.getData().contentEquals("02") ) {
    ....
}

이를 위해 notIn() 메서드도 추가했다.

if ( Cond.str(obj.getData()).notIn("01", "02") ) {
    ...
}

다음은 Str 클래스의 구현 코드다.

public class Cond {
    public static StrCond str(String s) {
        return new StrCond(s);
    }

    public static class StrCond {
        private String value;

        public StrCond(String value) {
            this.value = value;
        }

        public boolean in(String ... values) {
            for (String v : values) {
                if (v.equals(value)) return true;
            }
            return false;
        }

        public boolean notIn(String ... values) {
            for (String v : values) {
                if (v.equals(value)) return false;
            }
            return true;
        }
    }
}

 

  1. 김광수 2021.04.13 11:30

    구현코드를 변경해 보왔습니다. 그런데 Cond<T> 가 별로 의미 없어 보이긴 합니다 😅
    <code>
    public class CondTest {
    @Test
    void testStr() {
    assertThat(new Cond.Str("a").in("a", "b", "c")).isTrue();
    assertThat(new Cond.Str("d").in("a", "b", "c")).isFalse();
    assertThat(new Cond.Str("d").notIn("a", "b", "c")).isTrue();
    assertThat(new Cond.Str("a").notIn("a", "b", "c")).isFalse();
    }

    interface Cond<T> {
    boolean in(T... values);

    default boolean notIn(T... value) {
    return !in(value);
    }

    class Str implements Cond<String> {
    private final String value;

    public Str(String value) {
    this.value = value;
    }

    @Override
    public boolean in(String... values) {
    for (String v : values) {
    if (v.equals(value))
    return true;
    }
    return false;
    }
    }
    class Int implements Cond<Integer> {
    ...
    }
    }
    }
    </code>

반응형

곧 전달 받을 코드를 이리 저리 훑어 보다가 아래 형태 코드가 눈에 띄었다.

// someData.getIdList()는 String 타입으로 "id1|id2|id3"과 같은 형식
List<String> idList = Arrays.stream(someData.getIdList().split("[|]"))
        .collect(Collectors.toList());

split("[|]") 문자열로 검색해 보니 7 군데에서 완전 똑같은 형태의 코드를 사용하고 있다. 중복이 3번 이상 나고 있어서 이를 위한 보조 클래스 Splits을 만들었다.

public class Splits {
    public static List<String> splitByVbar(String str) {
        return Arrays.asList(str.split("[|]"));
    }
}

그리고 검색한 7 곳의 코드를 다음과 같이 바꿨다.

List<String> idList = Splits.splitByVbar(someData.getIdList().split("[|]"));

테스트 코드가 없어서 Splits.splitByVbar()를 사용하는 코드는 테스트를 할 수 없었다. 대신 기존의 분리 코드와 새 분리 코드가 같은 결과를 내는지 확인하는 테스트 코드를 작성했다.

@Test
void same() {
    assertThat(Splits.splitByVbar("1|2|3")).isEqualTo(oldSplitCode("1|2|3"));
    assertThat(Splits.splitByVbar("1|2|3|")).isEqualTo(oldSplitCode("1|2|3|"));
    assertThat(Splits.splitByVbar("|1|2|3|")).isEqualTo(oldSplitCode("|1|2|3"));
    assertThat(Splits.splitByVbar("1|2||3")).isEqualTo(oldSplitCode("1|2||3"));
}

private List<String> oldSplitCode(String str) {
    return Arrays.stream(str.split("[|]")).collect(Collectors.toList());
}

통과 됨을 확인하고 코드를 푸시했다.

반응형

아키텍트에게 기대하는 8가지 핵심 역량 영상: youtu.be/FbWHw6GBCrU

 

요약

  • 아키텍처 결정
  • 지속적인 아키텍처 분석
  • 최신 트렌드 유지
  • 결정 사항 준수 확인
  • 다양한 경험
  • 도메인 지식
  • 대인 관계 기술
  • 정치

 

반응형

1편: DB 트랜잭션의 원자성에 대해 조금 이해하는 시간을 가져봅니다. youtu.be/urpF7jwVNWs

 

2편: 동시성 문제(dirty read, dirty write, read skew, lost update, write skew)와 격리read committed, repeatable read, serializable 등)에 대해 이야기합니다. youtu.be/poyjLx-LOEU

 

반응형

여러 메서드에서 하나의 파라미터 타입을 사용하는 것에 대해 얘기해 봅니다.

 

반응형

좋은 코드를 만들 수 있는 간단한 방법 중 하나인 변수 아끼기에 대해 살펴봅니다.

 

반응형

프로그래밍 초식: WHAT? HOW?

 

반응형

프로그래밍 초식 - 나누기 

 

반응형

얼마전 회사 동료분이 JpaRepository가 아닌 Repository를 상속하는 이유에 대해 물어본 적이 있는데 그때 나눈 내용을 요약하면 아래와 같다.

  1. 메서드가 많으면 단위 테스트에서 명령 모델 리포지토리의 가짜 구현을 만들기 어렵다.
  2. 불필요한 메서드가 있으면 잘못 사용할 수 있다.

전체 내용은 아래 유튜브 영상을 참고한다.

 

  1. lee 2020.12.29 18:23

    안녕하세요. 영상 잘 보았습니다.

    혹시 가짜구현 예제의 MemoryUserRepository에서 모든 메소드에 대해 실제 구현을 한다는 것인가요?
    단위테스트에서 가짜 구현 부분을 Test double로는 커버하지 못하는 것이라 실제 구현이 필요한지 궁금합니다!

    • 최범균 madvirus 2020.12.30 00:12 신고

      네 가능하면 MemoryUserRepository는 모든 메서드에 대해 (기대하는 동작을 하도록) 구현을 한다는 겁니다.
      MemoryUserRepository도 테스트 더블 중 하나인 가짜 구현에 속하구요.

    • lee 2020.12.30 01:13

      혹 mock나 spy같은 것으로는 대처가 불가능 한 환경인가요? 아니면 가짜구현이 더 나은 장점이 있기에 선택하신 것 일까요?

    • 최범균 madvirus 2020.12.30 22:24 신고

      개인적으로는 가짜 구현이 요소 간 연동 변화에 테스트가 깨질 가능성이 더 적은 것 같아요.

  2. 최범균 madvirus 2020.12.30 22:23 신고

    개인적으로는 가짜 구현이 요소 간 연동 변화에 테스트가 깨질 가능성이 더 적은 것 같아요.

    • lee 2020.12.30 22:36

      아하 그렇군요.
      연동 부분에서 변화가 생기면 영향을 미치는 모든 곳을 찾아 mocking을 바꿔야 하니 놓치는 부분도 많이 생길 수 있다는 말씀으로 이해가 되었는데 경험이 적어 제대로 이해 했는지 잘 모르겠네요 ㅎㅎ

      mocking을 할때와 가짜구현을 할 때를 나누는 기준을 좀 더 조사해봐야 할 것 같습니다ㅜㅜ

      귀찮으셨을텐데 상세히 답변 기재해주셔서 감사합니다!

  3. 딸랑딸랑 2021.02.17 16:53

    잘 보고 갑니다...

  4. beginagain 2021.04.27 21:43

    다음카페 질문하기에 게시판선택이 되질않습니다...ㅜ
    게시판항목이 안나옵니다.

반응형

kafka 아는 척하기1 영상: (카프카 기본 구조, 토픽/파티션, 성능, 리플리카 등, youtu.be/0Ssx7jJJADI)

kafka 아는 척하기 1

 

kafka 아는 척하기 2 영상: 프로듀서 편 (youtu.be/geMtm17ofPY)

 

 

kafka 아는 척하기 3 영상: 컨슈머 편 (youtu.be/xqrIDHbGjOY)

 

 

 

반응형

MariaDB에서 grant usage ... with max_statement_time 명령어를 사용하면 사용자별로 최대 쿼리 실행 시간을 지정할 수 있다. 다음은 명령어 실행 예를 보여준다. 이때 시간은 초 단위다(MySQL도 동일한 유사한 기능이 있는데 시간 단위는 밀리초이다).

GRANT USAGE ON *.* TO batchuser@'%' WITH MAX_STATEMENT_TIME 60

사용자별로 지정한 최대 쿼리 실행 시간은 글로벌 시간에 우선한다.

반응형

CQRS(Command Query Responsibility Segregation) 아는 척하기1 영상: youtu.be/xf0kXMTFJm8

CQRS 아는 척하기 2 영상: youtu.be/H1IF3BUeFb8

 

+ Recent posts