우아한형제들/우아한테크코스

[우아한테크코스] 5주차후기 - 데이터베이스 개론 및 과제 피드백

Jay Tech 2019. 6. 10. 22:39
반응형

5주차 후기

이번 주 글은 후기와 피드백을 같이 적어본다.

날짜 TODO 추가 공부
6/3 (월) 로또 리뷰 -
6/4(화) 강의 (데이터베이스) 책-객체지향과 디자인패턴
6/5 (수) 프로그래밍 (로또 리뷰) 객체지향 사실과 오해
6/6 (목) 예비군  
6/7 (금) 휴무 로또 웹 UI 적용
6/8 (토) 운동  

이번 주는 휴무와 겹쳐서 여유가 조금 있는 한 주 였다.

강의: 데이터베이스 개론

준 코치님께서 데이터베이스에 대해 강의를 해주셨다. 준 코치님은 볼때 마다 항상 웃는 모습으로 인사를 해주셔서 너무 좋다. 강의는 간략한 개론으로, 강의 후 자기주도적으로 공부를 하면 되었다.

데이터와 정보의 차이

데이터 - 현실 세계에서 관찰하거나 측정한 사실 또는 값

정보 - 의사결정에 활용하기 위해 데이터를 처리한 결과물

먼저 위에 보이는 것 처럼 데이터와 정보의 차이에 대해서 설명을 해주셨다. 두 단어가 같은 의미인줄 알았지만 사실 저렇게 달랐다. 저 정의에 따르면 데이터는 조금 더 raw한 것이고 정보는 그것을 한 단계 가공한 것이라고 볼 수 있겠다.

데이터베이스 관리 시스템

데이터베이스 관리 시스템, 일명 DBMS는 데이터베이스의 생성과 관리를 담당하는 소프트웨어이다. 대표적으로 MySQL, Oracle 등이 있다.

JDBC

자바 표준 인터페이스로 자바를 이용하여 DBMS에 일관적인 방식으로 접근할 수 있도록 해주는 API이다.

JDBC (우테코 강의자료 발췌)

보는 것 처럼 JDBC를 이용하면 4단계로 이루어진다. 그리고 실습을 해보았다.

문제의 부분

그리고 한 가지 의문점이 생겼다. JDBC Driver를 로딩 후 바로 커넥션을 생성하는 부분에서 이해가 되지 않았다. 그래서 그 날은 그냥 저 부분을 계속 파보고 따로 정리를 하였다.

 

https://pjh3749.tistory.com/250

 

[JDBC] MySQL 드라이버 Class.forName()의 비밀 - 로드만 했을 뿐인데 getConnection()이 가능하다고?

도대체 JDBC드라이버는 Class.forName()으로 로딩만 했을 뿐인데 어떻게 DriverManager 에서 사용이 되는 것일까? Class.forName의 호출 Class 클래스는 JVM에서 동작할 클래스들의 정보를 묘사하기 위한 일종의..

pjh3749.tistory.com

 

5주차 피드백 - 로또 미션

 

어떤 특정 상태를 프린트할 때 출력기능을 도메인 객체안에서 진행했었다. 하지만 그것이 코드 복잡도를 높이는 설계라고 했다.

도메인에서 관리하는 값

해당 클래스는 인풋을 담당하는 클래스인데 여기서 로또 가격인 1000원이라는 숫자를 이용해야 했다. 하지만 저 1000원이라는 가격은 로또의 속성이므로 따로 값이 돌아다니게 되면 (실제로 1000원을 여러 클래스에서 이용하고있었다) 가격이 바뀌었을 때 여러 곳을 수정해야 한다. 따라서 로또 클래스 안에 public으로 가격의 값을 열어주었다.

 

코치님께 팁을 하나 주셨는데 네이밍도 LOTTO_PRICE가아닌 그냥 PRICE로 하는 것을 추천하셨다. Public이니까 접근 할 때

Lotto.PRICE // 읽기 좋음
Lotto.LOTTO_PRICE

이런식으로 접근하게 될 텐데 보는 것처럼 위가 더 읽기 좋기 때문이다.

객체 비교: Integer.compare의 사용

@Override
public int compareTo(LottoNumber o) {
    if (this.lottoNum > o.lottoNum) {
        return 1;
    }

    if (this.lottoNum < o.lottoNum) {
        return -1;
    }

    return 0;
}

이런 코드보다

@Override
public int compareTo(LottoNumber o) {
    return Integer.compare(this.lottoNum, o.lottoNum);
}

이렇게 변환하는게 훨씬 간편하다. 내부적으로 compare는 이렇게 원하는 로직으로 이미 구현 되어 있다. 굳이 내가 재정의해서 쓸 필요 없이 그대로 쓰면 코드가 간결해진다.

compare

객체의 책임

도메인 로직의 포함

수동으로 구매할 때 돈이 부족한지 판단하는 부분이다. 서비스 계층에 도메인 로직이 포함되어 있으면 안된다.

도메인 로직으로 이동

 

PurchaseMoney에서 돈이 적절한지 판단하는 부분으로 로직을 옮겼다. 이처럼 나도 모르게 무의식적으로 get을 해서 연산을 했던 부분이 종종 발견되었다. 객체의 역할에 대해서 조금 더 신경을 써야겠다.

스트림의 사용

스트림을 잘 사용하면 반복된 if문을 제거 할 수 있다.

중첩된 if문의 사용 모습

if (FIRST.match(matchCount)) {
    return FIRST;
}

if (SECOND.match(matchCount) && bonusMatch) {
    return SECOND;
}

if (THIRD.match(matchCount)) {
    return THIRD;
}

if (FOURTH.match(matchCount)) {
    return FOURTH;
}

if (FIFTH.match(matchCount)) {
    return FIFTH;
}

return NONE;

스트림의 사용

이런식으로 stream을 써서 간결하게 만들 수 있다.

반응형