본문 바로가기

분류 전체보기

(126)
[코드리뷰 정리] Level 1. 체스 미션 - Service Layer, DAO와 Repository 2021-04-10글 MVC와 Service 이번 미션에서 DB를 적용하면서 MVC 패턴에 추가로 Service 레이어를 도입하였다. 또한 DAO와 데이터 전달을 위한 DTO를 처음 사용했는데, DTO를 정리하고 DAO에 대해서도 새롭게 배운 부분이 많아 정리 ✍️ 휴의 코멘트에 답변을 달다가 나의 코멘트 내용을 정정해주면서 같이 주신 참고자료가 있는데, 서비스 계층과 비즈니스 로직이라는 개념이 다르다는 것을 제대로 인지하지 못하고 있었던 것 같다. 때문에 휴가 주신 MVC 패턴과 Service 레이어에 관한 글을 읽고 간단히 정리해본다. 각 계층에 대한 개념은 조금씩 상이하니 일단 블로그 글은 서비스 계측과 비즈니스 로직에 대한 참고 정도만 한 수준에서 정리하고 다음 레벨에서 상세히 잡아가는 것이 좋겠..
[코드리뷰 정리] Level 1. 체스 미션 - JDBC 2021-04-10글 JDBC (Java DataBase Connectivity) JDBC는 DB에 접근할 수 있도록 Java에서 제공하는 API로, 모든 Java의 Data Access 기술의 근간이다. 모든 Persistence Framework는 내부적으로 JDBC API를 이용한다. JDBC를 통한 DB 연결 1. 드라이버 로드 try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { System.err.println(" !! JDBC Driver load 오류: " + e.getMessage()); e.printStackTrace(); } 제공되는 클래스를 인스턴스화해서 내부적으로 저장해 메모리에 드..
[코드리뷰 정리] Level 1. 체스 미션 -DTO 이번 체스 미션에서는 웹 적용을 하면서 새롭게 배운 개념들이 너무 많았다. 때문에 이번 미션을 진행하면서 새로 배운 개념들과, 휴가 주신 피드백을 정리하는 방안으로 기록해야겠다 ✍️ step1에서의 DTO 사실 DTO의 개념은 대략 알고 있으나, 전 미션까지는 DTO의 필요성을 잘 못느끼고 있어서 사용하지는 않았었다. 이때 같은 경우는 현재 기물들을 나타내는 Pices 객체들만이 존재할 뿐인데 View에서는 64개의 position에 대한 정보를 출력하기 위해 Pieces의 메소드를 통해pieces.findByPosition(CACHE.get(xy)); 로 도메인에 대한 의존성이 생기고 있었다. 그래서 이를 제거하기 위해 휴의 리뷰대로 DTO를 만들어 View에 필요한 데이터들을 전달해주기로 하고 이 방..
📝 객체지향 설계 강의 노트 2021-03-23글 랜덤넘버는 구현체이니까 Number로 받자 이러면 모두가 움직이는데 ? 의존성 주입 DI 스프링 프레임 워크는 DI를 구현하도록 강제되어 있다. 의존성 주입을 위해서는 스프링을 써야한다는 말이 있는데 그렇지 않다. 스프링 프레임 워크를 쓰지 않은 채로 DI를 해본 적이 있습니까 ? 생성자 의존성 주입 ❓ randomNumbers를 객체의 변수로 두고있는데, move()의 인수로 넘겨받는 것은 어떨까요? -> 상관 없음 move 메서드를 사용할 때마다 객체를 생성해야하니 인자가 많아졌을 떄는 생성자를 전달하는 것이 좋을 수도.. ❓ 의존성 주입을 위한 setter는 괜찮나요 ? -> 어떤 객체냐에 따라 다른데, 지금은 Cars의 상태 데이터를 가지고 있는 현제 예시에서는 final로 ..
📝 엘레강트 오브젝트 뽀개기 1 강의 정리 2021-03-20글 강의를 들으며 정리하기 ✍️ 엘레강트 오브젝트 문자열과 원시값을 포장해라 반환 값은 모두 일급 컬렉션 인자의 값으로 null을 절대 허용하지 마세요 public Iterable find(String mask) { if (mask == null) { // . } else { // . } } null을 체크하는 로직을 구현하는 것은 객체를 무시하는 것이다. mask 객체를 존중했다면 조건의 존재 여부를 객체 스스로 결정하게 했을 것이다. 이를 위해 원시 값과 문자열을 포장하면 null을 허용하지 않을 수 있다. 이 부분이 randomNumber를 무시하는 것이 아닌가. randomNumber를 객체로 만든다. (원시값 포장). 객체에게 메시지를 보내도록 리팩토링한다. 테스트 가능하게 오..
[Java] 람다의 변수 범위 2021-03-19글 람다의 변수 범위 물론 위의 코드는 미션을 위해 일단 구현만을 목적으로 많은 리팩토링이 필요하니 참고 🥲 미션을 진행하다가 for 문 내에 stream을 쓰게 되었는데, i의 값을 람다식 내에서 사용하려니 컴파일 에러가 났다. "Variable used in lambda expression should be final or effectively final" 즉 람다식에서 사용되는 변수는 final이거나 effectively final이어야 한다. effectively final은 무엇이며, 람다의 변수 범위를 정확히 짚고 넘어가자. 람다의 변수 범위 다음과 같은 Lambda 클래스가 있고, 각각의 메서드를 호출해 클래스 필드인 i가 어떻게 바뀌는지 살펴본다 🔎 public class..
[Java] Lambda, Stream API 강의 정리 2021-03-16글 함수형 프로그래밍의 장점 ? 관심사의 분리 관심사의 분리란 무엇일까? 예제를 들어보자. List numbers = Arrays.asList(1, 2, 3, 4, 5); 리스트에 있는 원소마다 콜론을 추가하려 한다. 이때 forEach() 를 사용한다면 ? @Test public void ForEach를_활용하여_콜론을_추가하는_문자열_작성() { StringBuilder stringBuilder = new StringBuilder(); for (Integer number : numbers) { stringBuilder.append(number).append(" : "); } if (stringBuilder.length() > 0) { stringBuilder.delete(string..
[코드 리뷰 정리] Level 1. 블랙잭 2021-03-15글 Controller에 있는 도메인 로직 게임 진행을 위해 Controller에 많은 역할을 구현했었다. 위 피드백을 받고 BlackjackGame이라는 객체를 만들어 게임의 진행을 하도록 구현했다. 각각의 플레이어들의 게임을 진행에 Input과 Output이 연결되어 있어서 처음 리팩토링에서는 BlackjackGame에서 플레이어들을 꺼내오고, 플레이어 하나 하나마다 게임을 진행하게 되었다. BlackjackController 일부 private void askWantToHit(Player player, BlackjackGame blackjackGame) { while (isAbleToAskHit(player, blackjackGame) && Answer.of(InputView.in..