-
Notifications
You must be signed in to change notification settings - Fork 1
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
base: week1
Are you sure you want to change the base?
Conversation
BANKER("1"), | ||
MEMBER("2"), | ||
STOP("0"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
static 블럭으로 enum 값 초기화 해주는 것 아주 좋군요 !
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
글고 해당 케이스들에 대해 enum 클래스로 따로 정의해서 util 패키지로 빼는 것 아주 깔꼼합니다 !
저도 심화과제 할 때 쇽샥 해야겠어요 👍
private final SelectionValidator selectionValidator = new SelectionValidator(); | ||
private final MemberService memberService = new MemberService(); | ||
private final AccountService accountService = new AccountService(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요런 필드들은 BankerController 객체를 생성할 때 생성자 주입 방식으로 변경해서 객체 간의 결합도를 낮춰도 좋을 것 같은데, 또 어찌 생각해보면 지금 현재 memberService가 인터페이스 형식이 아니다보니, 객체를 변경할 일이 없을까 싶기도 하고..
혹시 동규님은 어떻게 생각하시나용 ?!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@yeseul106
옹 저도 동감입니다!!
그럼 살짝 객체 변경의 가능성도 있으니
인터페이스까지 만들어서 필드 타입을 인터페이스로 수정하는 것까지 해봐야겠네요
public void registerMember(String name, String personalNumber) { | ||
MemberRepository.registerMember(name, personalNumber); | ||
} | ||
|
||
public Member findMemberByNameAndPN(String name, String personalNuber) { | ||
return MemberRepository.findMemberByNameAndPN(name, personalNuber); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기서는 단순히 리포지토리 계층의 역할만 필요한 것 같은데 중간에 Service 단을 두신 이유가 궁금합니다 !
Controller에서 바로 리포지토리로 접근하는 것이 어색하기 때문일까요 ? 🧐
아니면 이후 Service에 비지니스 로직이 추가 될 수 있으니까 일단 구조를 잡기 위해 ?
There was a problem hiding this comment.
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 단에서 예외를 바꿔 던질 수 있도록 하기 위해서도 있었습니다!!)
There was a problem hiding this comment.
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 { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
지저분해 보일 수 있는 문자열 선언까지.. util에 따로 빼서 관리 깔끔한 것 같습니다. 배워 가네요 짱 !!!!
There was a problem hiding this 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(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
validator를 인스턴스화 시키는 것보다 static으로 두는 것은 어떤가요? 필드도 없고 util을 위한 거잖아요:)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@shb03323 음!!! 좋은것같아요!!
아까 스터디에서 얘기했던 부분이네요 :)
바로 반영해보겠습니다!!
(얼른 완성해야겠네요...미완성인데 염치없이 리뷰를 부탁해서 죄송한 마음이...ㅠㅜ헣ㅎ)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
뭔데 둘이 무슨 스터디하는데 뭔데 ? 둘이 어떻게 아는건데 뭔데 뭔데 ? 🧐🧐🧐🧐🧐🧐
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
우리 이펙티브 자바 스터디 멘토님이시라구
private final MemberService memberService = new MemberService(); | ||
private final AccountService accountService = new AccountService(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
service라는 이름을 사용하는 이유가 무엇인지 여쭈어봐도 될까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@shb03323
사실 버릇 80% 해당 도메인들에 대한 기능 제공의 의미에서 Service로 설정한 것이 20%인것 같습니다...ㅋㅋㅋ
public class BankerController implements Controller { | ||
private final SelectionValidator selectionValidator = new SelectionValidator(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
전체적으로 컨트롤러의 역할이 비대하다고 느껴지는데요. 컨트롤러의 역할이 무엇인지 생각해보시면 좋을 것 같습니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
분리를 더 확실히해야겠네요..!!
감사합니다!!!! 😍
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()); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
else if를 쓰지 않으려면 어떻게 해야할까요?
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)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
else if 여기도 마찬가지입니다!
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(); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
MemberSelection.valueOf(~~~)를 이용하면 else if가 없어질 것 같아요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오우 꿀팁 감사드립니다아
Enum을 쓰는 역량이 아직 부족했네요...킼킥
REGISTER("1"), | ||
NEW_ACCOUNT("2"), | ||
STOP("3"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Integer형인데 String이 아닌 int로 될 것 같습니다:)
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); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
밑의코드들도 마찬가지인데, 메서드 분리를 해주면 되게 좋을 것 같아요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
우앗 감사합니다!!
확실히 뭔가 복잡 지저분의 느낌이 물씬이었네요 ㅋㅋㅋ
|
||
import lombok.*; | ||
|
||
@Data |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@DaTa를 쓰신 이유에 대해 여쭈어봐도 괜찮을까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
getter와 setter랑 더불어
추후 동일 계좌라는 비교 때, 인스턴스 해시값이 아닌
필드 값의 비교로 설정하고자 사용했습니다..!!
SERVER PR
🐕 과제 구현 명세
✅ 기본 과제
Basic
extend
abstractExtend.class
commonExtend.class
implement
Missile
Nuclear
인터페이스 / 단순 코드 재사용을 위한NameTag
클래스✅ 심화 과제
Advanced
🐥 이런 점이 새로웠어요 / 어려웠어요
extends
과implements
를 단일 클래스에 다중 적용을 처음 해본 경험default
를 통해 같은 타입 추상화 구현 객체들의 공통 메서드까지 선언해서 사용해봤습니다.하지만 주입을 어떤 방식으로 할지, 외부로부터 주입하는것이 좋을지 내부 필드 자체 주입이 좋은지 판단하기 어려웠습니다.