[JAVA 백엔드 스터디] 7회차

minhyeok·2023년 2월 25일
0
post-thumbnail

학습내용

  • 지금까지 배운 내용을 이용해 프로그램을 구현해보자.

7회차 미션

헬스장 회원 관리 프로그램

1단계 - 회원 등록 시스템 구현
2단계 - 회원 조회 시스템 구현
3단계 - VIP 회원 시스템 구현

조건

  • 회원 정보를 저장할 저장소(MemberRepository)라는 클래스를 만들어서 활용해라.
    • MemberRepository는 회원을 조회, 저장을 할 수 있어야 한다.
  • 회원은 일반 회원VIP 회원으로 나뉜다.
  • 일반 회원을 등록할 때는, 이메일, 이름, 나이 정보를 받아야 한다.
  • VIP 회원을 등록할 때는, 이메일, 이름, 나이, 신청 PT 횟수 정보를 받아야 한다.
  • 회원(일반 회원, VIP 회원)을 등록할 때, 동일한 이메일을 가진 회원은 중복해서 존재할 수 없다.

풀이 과정

menu 변수로 입력을 받아 , 해당하는 기능을 작동하도록 한다.
Member 변수를 생성하여, 인자로 email,name,age 를 넘겨 생성할때 저장하도록 한다. 이메일이 중복인지 검사하는 checkDuplicateEmail 를 통해 중복이면 예외를 발생시킨다.
중복이 아니라면 , memberRepository.add(member); 를 통해 회원 정보를 저장한다. - 1단계
회원 조회를 원할 경우에는, searchMemberName 에서 향상된 for문을 통해, 입력받은 이름과 같은 이름이 있다면 해당 정보를 출력하도록 한다. 만약 존재하지 않다면, 예외를 발생한다. - 2단계
VIPMember 클래스는 Member 클래스를 상속하여 PT 횟수를 추가로 저장한다.
회원을 조회할때, 일반 회원과 VIP 회원은 getClass() 메서드를 이용하여 구현하였다. 이번에 처음 알게 된 메서드라 공부를 하게 되었다.

코드 깃허브 링크


정리

  • 배운 내용, 깨달은 점
    클래스와 ArrayList 를 더 공부하게 되었다. 클래스(객체) 를 매개 변수로 넘기는 법과, 객체를 생성할때 인자를 설정하는 방법을 굉장히 고민 많이 하였는데, 책과 팀원의 도움을 통해 해결할 수 있었다.
    또한, 회원 조회를 하거나 중복 이메일을 찾기 위해 향상된 for 문을 이용하는 부분이 있었는데, 기존에 알던 for 문이 아니라 사용법이 어려웠다. 이번 과제는 시간을 굉장히 많이 썼는데, 아쉬움이 많이 남는다. 처음 보았을 때는 쉬워 보여 쉽게 구현하였다. 따라서 회원 삭제와 같은 추가기능도 구현하고자 하였지만, 2단계 까지 작성했던 코드가 3단계로 넘어가면서 잘못 구현했다는 것을 깨닫게 되어 거의 처음부터 뜯어 고치게 되었다.
    어떤 문제가 있었나면, 첫번째 입력에는 잘 받고 저장도 잘 되지만, 예를 들면 회원을 두번 입력하게 되면 첫번째로 등록한 회원이 사라지게 되었다. 마지막으로 등록한 회원만 조회가 되었다. ArrayList를 제대로 활용하지 못해 발생한 문제였던 것 같다.
    사실 이 부분은 public void add(Member member) 이 부분이 어떻게 해결해야 할지 몰라 public void add(String email,String name,int age) 와 같은 방식으로 인자를 넘겨주려 하였다. 이 부분에서 문제가 되었던 것 같다. 이 부분에서 해결하기 위해 시간을 많이 쓰게 되었다. 인자로 아무거나 막 집어넣어보다가 Member 클래스 변수가 필요하다 생각해 따로 생성을 하고 집어 넣게 되었다. 사실 지금도 코드에 있어서 이해가 안가는 부분이 많다. 이 미션은 제출하고 나서도 따로 더 공부할 생각이다.
  • 어려웠던 점, 반성하고 싶은 점 / 개선할 방법
    클래스를 매개 변수로 넘기는 부분(memberRepository.add(member);)과,
    member = new Member(email,name,age); 이 부분이 가장 어려웠다. 또한 ,getClass() 메서드를 이용하는 방법도 생소하여 어려움이 있었다. 이 부분에서 확실히 class 와 ArrayList 가 중요하다고 생각된다. 항상 코딩을 할때 어려운 부분이 이렇게 인자나 매개변수를 넘기는 부분이 가장 어렵다고 생각된다. 이 부분을 더 정확히 공부해야되겠다.

  • 질문


    위의 사진과 같이 제가 이름을 Exception 으로 설정하는 경우는 실행이 안됩니다. RuntimeException 중 존재하는 Exception 종류 중에서만 설정이 가능한건가요?
    또,

member = new Member(email,name,age);
memberRepository.checkDuplicateEmail(member.getEmail());
System.out.println("회원 등록이 성공적으로 완료되었습니다.");
memberRepository.add(member);

이 부분의 로직이 어렵습니다. 제가 이해한 바로는,

new Member를 통해 Member를 새로 생성하여 입력받은 (email,name,age)를 넘겨 저장하도록 하고, 그 다음 이메일 중복 검사를 통해 저장되어있는 members 중 email 이 같은 것이 발견되면 예외를 던지게 되어, 등록되지 않고 add가 실행되지 않는다. 중복이 없다면 add 를 통해 member 변수가 memberRepository에 저장된다

입니다.(말이 정확하지 않을 수도 있습니다 ㅠㅠ) 제가 이해한 것이 맞을까요?
MemberRepository 클래스는 List 를 통해 mebers라는 변수에 member 들의 정보를 저장하고, Member 클래스는 member 한명당의 정보를 저장하는게 맞는거죠?

또한,

public void searchMemberName(String name) {
        for (Member member : this.members) {
            if (member.getName().equals(name)) {
                if (member.getClass() != Member.class) {
                    System.out.println(
                        member.getName() + "님은 VIP 회원이고, 이메일은 " + member.getEmail()
                            + "이고, 나이는 " + member.getAge() + "살입니다.");
                } else {
                    System.out.println(
                        member.getName() + "님은 일반 회원이고, 이메일은 " + member.getEmail()
                            + "이고, 나이는 " + member.getAge() + "살입니다.");
                }
                return;
            }
        }//else if(!member.getName().equals(name))
        throw new IllegalArgumentException("등록되지 않은 회원입니다.");

    }

MemberRepository 클래스의 searchMemberName 함수입니다.
return 이 존재하는 부분에서, 만약 return이 없다면 계속해서 예외도 발생하게 됩니다.
처음에는 주석처리한 부분과 같이 else if 구문에서 처리하려고 하였는데(위치가 정확하진 않을수있습니다), 제대로 작동하지 않아 방법을 찾다가 return 을 통해 해결하였습니다. 왜 그런지 알 수 있을까요?

1개의 댓글

comment-user-thumbnail
2023년 2월 28일

안녕하세요😄 미션 잘 수행해주셨네요! 제가 오픈 톡방에 올려드린 예시 코드랑 비교해보시면서 배울 부분 찾아보시면 좋을 것 같네요👍 예시 코드를 보고나서도 이해 안 되시는 부분이 있거나, 궁금한 점 생기시면 언제든 질문 주세요~~~

블로그 글에 남겨주신 궁금한 점에 대해서 답변 드리도록 할게요!

Q. 위의 사진과 같이 제가 이름을 Exception 으로 설정하는 경우는 실행이 안됩니다. RuntimeException 중 존재하는 Exception 종류 중에서만 설정이 가능한건가요?

A. 혹시 Exception으로 설정했을 때 어떻게 작동하지 않는 지도 보여주실 수 있을까요~?

Q. new Member를 통해 Member를 새로 생성하여 입력받은 (email,name,age)를 넘겨 저장하도록 하고, 그 다음 이메일 중복 검사를 통해 저장되어있는 members 중 email 이 같은 것이 발견되면 예외를 던지게 되어, 등록되지 않고 add가 실행되지 않는다. 중복이 없다면 add 를 통해 member 변수가 memberRepository에 저장된다
입니다.(말이 정확하지 않을 수도 있습니다 ㅠㅠ) 제가 이해한 것이 맞을까요?

A. 네! 이해하신 방향이 맞습니다~! 제 예시코드 보시면 이 부분에 대해서 이해하실 수 있을거에요! 혹시 예시 코드 보고도 이해 안 되시면 말씀해주세요ㅎㅎㅎ

Q. MemberRepository 클래스는 List 를 통해 mebers라는 변수에 member 들의 정보를 저장하고, Member 클래스는 member 한명당의 정보를 저장하는게 맞는거죠?

A. 네! 맞습니다!!!

Q. return 이 존재하는 부분에서, 만약 return이 없다면 계속해서 예외도 발생하게 됩니다.
처음에는 주석처리한 부분과 같이 else if 구문에서 처리하려고 하였는데(위치가 정확하진 않을수있습니다), 제대로 작동하지 않아 방법을 찾다가 return 을 통해 해결하였습니다. 왜 그런지 알 수 있을까요?

A. 함수 내의 로직에서 return이 없다면 함수 내부에 있는 모든 줄의 코드를 실행시키게 됩니다. throw new... 부분의 코드를 봤을 때, if문 안에 있는 형태도 아니라서 searchMemberName이라는 메서드를 실행시킬 때마다 throw new... 부분의 코드를 실행시킬거에요! 이 때문에 예외가 계속해서 발생하는 걸로 보이네요~~!

답글 달기