Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1주차] 기본 과제 & 심화과제 #1

Open
wants to merge 2 commits into
base: week1
Choose a base branch
from

Conversation

yummygyudon
Copy link
Collaborator

@yummygyudon yummygyudon commented Apr 20, 2023

SERVER PR

🐕 과제 구현 명세

✅ 기본 과제

  • 패키지 = Basic
    • 상속 예제 작성 : extend
      • 추상 클래스 상속 : abstractExtend.class
      • 단순 클래스 상속 : commonExtend.class
    • 구현 예제 작성 : implement
      • extends 상속 & implement 구현 활용
      • Missile Nuclear 인터페이스 / 단순 코드 재사용을 위한NameTag 클래스

✅ 심화 과제


🐥 이런 점이 새로웠어요 / 어려웠어요

  • 기본 과제
    • extendsimplements 를 단일 클래스에 다중 적용을 처음 해본 경험
      • 단순 공통 코드 재사용을 위해서 extends 를 사용했고 필수 공통 메서드 표준화를 위해 인터페이스를 생성하여 implements 했습니다.
    • default를 통해 같은 타입 추상화 구현 객체들의 공통 메서드까지 선언해서 사용해봤습니다.
  • 심화 과제
    • Scanner를 통한 입력과 출력 기능 클래스를 어떤 Layer에서 사용해야할지 기준을 정하기가 어려웠습니다.
    • Spring 프레임워크를 사용하지 않았기에 싱글톤 패턴 자동 적용과 자동 주입 기능이 아닌 직접 주입하는 방법을 사용했어야 했습니다.
      하지만 주입을 어떤 방식으로 할지, 외부로부터 주입하는것이 좋을지 내부 필드 자체 주입이 좋은지 판단하기 어려웠습니다.

Comment on lines +7 to +9
BANKER("1"),
MEMBER("2"),
STOP("0");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static 블럭으로 enum 값 초기화 해주는 것 아주 좋군요 !

Copy link

@yeseul106 yeseul106 Apr 21, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

글고 해당 케이스들에 대해 enum 클래스로 따로 정의해서 util 패키지로 빼는 것 아주 깔꼼합니다 !
저도 심화과제 할 때 쇽샥 해야겠어요 👍

Comment on lines +15 to +17
private final SelectionValidator selectionValidator = new SelectionValidator();
private final MemberService memberService = new MemberService();
private final AccountService accountService = new AccountService();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요런 필드들은 BankerController 객체를 생성할 때 생성자 주입 방식으로 변경해서 객체 간의 결합도를 낮춰도 좋을 것 같은데, 또 어찌 생각해보면 지금 현재 memberService가 인터페이스 형식이 아니다보니, 객체를 변경할 일이 없을까 싶기도 하고..
혹시 동규님은 어떻게 생각하시나용 ?!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@yeseul106
옹 저도 동감입니다!!
그럼 살짝 객체 변경의 가능성도 있으니
인터페이스까지 만들어서 필드 타입을 인터페이스로 수정하는 것까지 해봐야겠네요 ☺️

Comment on lines +8 to +14
public void registerMember(String name, String personalNumber) {
MemberRepository.registerMember(name, personalNumber);
}

public Member findMemberByNameAndPN(String name, String personalNuber) {
return MemberRepository.findMemberByNameAndPN(name, personalNuber);
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기서는 단순히 리포지토리 계층의 역할만 필요한 것 같은데 중간에 Service 단을 두신 이유가 궁금합니다 !
Controller에서 바로 리포지토리로 접근하는 것이 어색하기 때문일까요 ? 🧐
아니면 이후 Service에 비지니스 로직이 추가 될 수 있으니까 일단 구조를 잡기 위해 ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

우선 패턴 상으로는 MVC 패턴을 구사하려고 노력했는데
Controller에서는 View와 Service에 대해서만 알도록하고
Repository에 접근할 수 있는건 Service만 있도록 하고 싶어 분리했습니다!!
Controller에서 Repository까지 접근할 수 있으면
너무 많은 책임을 할당받는다 생각되어서요!!
(++ 추후 비즈니스 전용 Exception을 생성한다고 했을 때, Service 단에서 예외를 바꿔 던질 수 있도록 하기 위해서도 있었습니다!!)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오홍 그렇군요 ! 이해 되는 이유네요 !! 설명 감사합니다 👍

@@ -0,0 +1,14 @@
package org.example.util;

public class Command {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지저분해 보일 수 있는 문자열 선언까지.. util에 따로 빼서 관리 깔끔한 것 같습니다. 배워 가네요 짱 !!!!

Copy link

@yeseul106 yeseul106 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

진짜 오마오마갓이네요 !!!! 이정도면 은행에서 실제 돌리는 애플리케이션이라고 해도 될 정도로 요구사항도 정말 자세하고 꼼꼼하게 짜고 (체크리스트까지.. 고려하는.. 그는.. 우리조 동규밭 과수원길..), 그 요구사항 바탕으로 구현까지 완벽히 하신 것 같아요 ! 이 열쩡에 진짜 자극도 많이 되고 많이 얻어가는 것 같습니다. 쵝오. 과제 너무 수고하셨어요 !!! 💫

근데 한가지 트랜잭션 관리까지 야무지게 해주신 것 같은데, 요 부분에 대해 저도 알고 싶어서요 ! 트랜잭션을 고려하신 전체적인 플로우가 궁금합니다 설명 해주시면 땡큐베리감사 헤헤

import org.example.view.Out;

public class BankerController implements Controller {
private final SelectionValidator selectionValidator = new SelectionValidator();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

validator를 인스턴스화 시키는 것보다 static으로 두는 것은 어떤가요? 필드도 없고 util을 위한 거잖아요:)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@shb03323 음!!! 좋은것같아요!!
아까 스터디에서 얘기했던 부분이네요 :)
바로 반영해보겠습니다!!
(얼른 완성해야겠네요...미완성인데 염치없이 리뷰를 부탁해서 죄송한 마음이...ㅠㅜ헣ㅎ)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

뭔데 둘이 무슨 스터디하는데 뭔데 ? 둘이 어떻게 아는건데 뭔데 뭔데 ? 🧐🧐🧐🧐🧐🧐

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

우리 이펙티브 자바 스터디 멘토님이시라구

Comment on lines +17 to +18
private final MemberService memberService = new MemberService();
private final AccountService accountService = new AccountService();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

service라는 이름을 사용하는 이유가 무엇인지 여쭈어봐도 될까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@shb03323
사실 버릇 80% 해당 도메인들에 대한 기능 제공의 의미에서 Service로 설정한 것이 20%인것 같습니다...ㅋㅋㅋ

Comment on lines +15 to +16
public class BankerController implements Controller {
private final SelectionValidator selectionValidator = new SelectionValidator();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전체적으로 컨트롤러의 역할이 비대하다고 느껴지는데요. 컨트롤러의 역할이 무엇인지 생각해보시면 좋을 것 같습니다

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

분리를 더 확실히해야겠네요..!!
감사합니다!!!! 😍

Comment on lines +47 to +57
private void executeFeature(String selection) {
try {
if (BankerSelection.REGISTER.selection().equals(selection)) {
register();
} else if (BankerSelection.NEW_ACCOUNT.selection().equals(selection)) {
createAccount();
}
} catch (IllegalArgumentException e) {
Out.print(e.getMessage());
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

else if를 쓰지 않으려면 어떻게 해야할까요?

Comment on lines +23 to +30
do {
selection = selectRole();
if (MainSelection.BANKER.selection().equals(selection)) {
bankerController.run();
} else if (MainSelection.MEMBER.selection().equals(selection)) {
memberController.run();
}
} while (!MainSelection.STOP.selection().equals(selection));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

else if 여기도 마찬가지입니다!

Comment on lines +49 to +59
private void executeFeature(String selection) {
if (MemberSelection.DEPOSIT.selection().equals(selection)) {
deposit();
} else if (MemberSelection.WITHDRAW.selection().equals(selection)) {
withdraw();
} else if (MemberSelection.REMITTANCE.selection().equals(selection)) {
send();
} else if (MemberSelection.TRANSACTIONS.selection().equals(selection)) {
viewTransactions();
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MemberSelection.valueOf(~~~)를 이용하면 else if가 없어질 것 같아요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오우 꿀팁 감사드립니다아 ☺️
Enum을 쓰는 역량이 아직 부족했네요...킼킥

Comment on lines +4 to +6
REGISTER("1"),
NEW_ACCOUNT("2"),
STOP("3");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Integer형인데 String이 아닌 int로 될 것 같습니다:)

Comment on lines +9 to +16
public void validateMainSelection(String selection) {
if (Arrays.stream(MainSelection.values())
.noneMatch(var -> var.selection().equals(selection))) {
throw new IllegalArgumentException(SystemErrorMessage.WRONG_SELECT);
} else if (selection.isBlank() || selection.isEmpty()) {
throw new IllegalArgumentException(SystemErrorMessage.INPUT_BLANK);
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

밑의코드들도 마찬가지인데, 메서드 분리를 해주면 되게 좋을 것 같아요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

우앗 감사합니다!!
확실히 뭔가 복잡 지저분의 느낌이 물씬이었네요 ㅋㅋㅋ


import lombok.*;

@Data

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@DaTa를 쓰신 이유에 대해 여쭈어봐도 괜찮을까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

getter와 setter랑 더불어
추후 동일 계좌라는 비교 때, 인스턴스 해시값이 아닌
필드 값의 비교로 설정하고자 사용했습니다..!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants