우아한테크코스/레벨1

체스 미션 학습로그

nauni 2021. 4. 5. 13:32

STEP 1,2,3 PR링크

학습로그 1-1

[Java] Functional Interface - 3

내용

- Consumer 타입은 인자로 받아 리턴하지 않고 소진한다.
- Command 명령어를 Consumer<인자타입> 를 받아 함수 표현식을 accept()로 실행가능하다. if 분기문을 줄일 수 있다.
- Function<인자타입, 반환타입> 값으로 표현식을 받아 apply()로 실행가능하다.

[Java] StreamAPI - 3

내용

- reduce(BinaryOperator accumulator) => Optional
- reduce(T identity, BinaryOperator accumulator) => T
- reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator combiner) => U
- 리듀스는 스트림의 최종연산이다. 요소를 하나씩 줄여가며 누적 연산을 한다.
- 2번째 리듀스를 사용하여 연산해주었다. <초기값, 연산내용> 을 받아서 초기값을 기준으로 누적연산이 가능하다.

class BlackSet {  
    private Score subtractWhenOnSameLine(Map<Character, Integer> pawnCount){  
        return pawnCount.values().stream()  
            .filter(number -> number > 1)  
            .map(number -> new Score(MINUS_HALF_POINT * number))  
            .reduce(Score.ZERO, Score::add);  
    }  
}  

링크

javadocs StreamAPI

학습로그 1-2

[Java] Function Interface - 2

내용

- UnaryOperator 는 T타입을 받아서 T타입을 리턴한다. Funtion Interface와 비슷하지만 인자로 들어오는 타입과 반환하는 타입이 같다는 특징이 있다.

[OOP] Setter - 3

내용

- setXXX라는 set 명칭말고 메서드에 의도를 들어내어 이름을 지으면 setter의 단점을 보완할 수 있다.
- setter 자체는 의도를 가지기 어렵다.

[Java] UnsupportedOperationException - 2

내용

- 지원하지 않는 연산 예외처리
- 런타임 예외
- 대표적으로 Collections.unmodifiableList 에서 add할 경우

링크

javadocs UnsupportedOperationException

[Java] Enum - 3

내용

- Enum에는 기본적으로 static <T extends Enum> valueOf(String value) 가 정의되어 있다. 따라서 valueOf(String s)의 정적팩토리 메서드가 만들어지지 않는다.
- 이외에도 clone(), compareTo(E o), equals, toString, names, finalize 등이 기본적으로 정의되어 있다.

링크

javadocs Enum

[Java] Table - 3

내용

- row, column 을 키로 테이블을 만들 수 있다.
- compile('com.google.guava:guava:29.0-jre') dependencies에 추가하여 사용한다.
- LinkedHashMap을 기반으로 구현되는 `HashBasedTable.create();`을 사용하였다.

링크

Table 사용방법


 

 

STEP 4,5 PR 링크

학습로그 2-1

[DB] MySQL query - 5

내용

- primaryKey는 유일키이다. (중복 불가)
- CLI 환경에서 MySQL 확인하는 명령어들

# 도커에서 띄우기 (설치 과정은 생략)  
docker exec -it <이름\> bash  
mysql -u root -p  
<비밀번호\>  
# --> 접속완료  
show databases;  

use <특정 데이터 베이스>;  

CREATE TABLE <테이블이름> (  
    id int NOT NULL AUTO_INCREMENT,  
    game_id int NOT NULL,  
    ... 해당하는 내용들 ...
    PRIMARY KEY (id)  
);  

INSERT INTO <테이블이름> (키들을 특정(없을시 전체)) VALUES (해당 키에 해당하는 값);  

SELECT * FROM chessTable;  

[웹 UI] 렌더링 - 4

내용

  • SSR: 서버에서 온전한 html을 보내줘서 화면 전체를 업데이트
    • 장점: SEO(검색엔진최적화)에 유리, 빠른 초기 로딩속도
    • 단점: 사용자 친화적이지 않음, 깜빡임현상, 서버부하가 많이 됨
  • CSR: 서버에서는 리소스만 받고(API를 통해) 클라이언트 측에서 해당 내용을 조작하여 화면을 업데이트
    • 장점: 빠른 속도 및 서버부하 감소
    • 단점: 초기 로딩속도가 느림
  • 컨텐츠 중심의 개발이 필요하다
    • 단순한 정적 컨텐츠 -> 서버 사이드 렌더링
    • 동적인 컨텐츠 -> 클라이언트 사이드 렌더링

참고

- 테코톡

[DB] 객체관리 - 4

내용

- 객체와 String 타입의 key=value 값을 상호변환해주기 위해서는 dao, dto 등의 클래스들이 사용된다.
- dao: Data Access Object로 DB의 값에 직접 접근하는 객체
- dto: Data Transfer Object로 View단과 객체를 주고받을 때 사용하는 객체
- dao, dto의 필요성을 전보다 좀 더 강하게 느낄 수 있었다.
- DB와 Domain을 연결하기 위해서는 사이에 값들을 객체를 통해 문자화 해주는 작업이 필요했다.

[JS] 이벤트 - 5

내용

- event.target: 내가 선택한 바로 그 Node!
- event.currentTarget: 내가 이벤트를 등록해준 그 Node! (더 넓은 범위)

학습로그 2-2

[OOP] Package구조 - 3

내용

- 일반적으로 domain, service, dao 패키지로 나뉘는 듯 하다.
- dao: DB에 접속하여 데이터를 가져오는 클래스. 일반적으로 Dao는 테이블당 하나 만들게 됨
- service: domain과 dao로 직접 접근하여 기능 구현. dao 연동뿐 아니라 데이터베이스에 종속되지 않는 로직을 구현.
- dao, service 모두 호환을 위해 인터페이스를 만들고 구현하는 방식을 사용하기도 함

링크

패키지 구조를 어떻게 가져가는게 좋을까?
계층별 패키지 구성하기
스프링 입문을 위한 자바 객체 지향의 원리와 이해(책)

[Structure] Service Layer - 4

내용

- Data Access Layer: 개별 SQL을 처리하는 것을 목표로 한다.
- Service Layer: 여러 Data Access Layer를 하나로 묶어 관리한다. 데이터 베이스에 대한 트랜젝션을 관리한다.
- 기능 단위로 interface의 책임을 작게 구성하는 것이 좋다.
- 의존성주입을 통해 Service를 구현한 class가 사용되는 듯 하다.

링크

Service Layer
Service의 적절한 크기 가이드

[Structure] VO, DTO - 3

내용

- DTO(Data Transfer Object)
    - 데이터 전달용, 데이터를 담아 전달하는 바구니
    - 계층 간 데이터를 전달 (Controller~Service)
    - getter, setter 이외의 다른 로직을 갖지 않음
    - DTO도 불변객체 가능


- VO(Value Object)
    - 값 표현용, 값 그 자체를 표현하는 객체
    - equals, hashCode 오버라이딩을 하여 비교한다.

참고

- 테코톡

[Java] try with resources - 4

내용

- java 7 부터 지원
- 그전에는 finally를 사용하여 리소스를 정리해주었다.
- 사용한 리소스를 종료할 때 반드시 닫아줌(정리해줌)
- try catch 절이 종료되면 자동으로 close()를 호출해준다.
- try 구문의 `()`부분에 정리할 리소스를 넣어준다.

try (정리할 리소스) {  
...내용...  
} catch (Exception e) {  
}  

링크

javadocs try-with-resources
참고한 블로그