본문 바로가기

SPRING/Spring

[스프링| 스프링 핵심 원리 | 기본편 | 스프링 핵심 원리 이해1 - 예제 만들기] 도메인 개발

package hello.core.member;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.

public enum Grade {
// 이 줄은 'public' 접근 제어자로 선언된 'enum' Grade를 정의합니다. 'enum'은 열거형으로, 한정된 상수 값만을 멤버로 가지는 특수한 클래스 타입입니다.

    BASIC,
    // 'BASIC'은 Grade 열거형의 첫 번째 상수입니다. 이는 회원 등급 중 기본 등급을 나타냅니다.

    VIP
    // 'VIP'는 Grade 열거형의 두 번째 상수입니다. 이는 회원 등급 중 높은 등급을 나타냅니다.
}
package hello.core.member;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.

public class Member {
// 이 줄은 public 클래스 Member를 선언합니다. public으로 선언되어 다른 패키지에서도 접근할 수 있습니다.

    private Long id;
    // Long 타입의 private 변수 'id'를 선언합니다. private은 같은 클래스 내에서만 접근할 수 있음을 의미합니다.
    private String name;
    // String 타입의 private 변수 'name'을 선언합니다. 이 변수는 회원의 이름을 저장합니다.
    private Grade grade;
    // Grade 타입의 private 변수 'grade'를 선언합니다. 이 변수는 회원의 등급을 나타냅니다.
    public Member(Long id, String name, Grade grade) {
    // Member 클래스의 생성자입니다. 객체가 생성될 때 'id', 'name', 'grade' 값으로 초기화합니다.

        this.id = id;
        // 'this.id'는 클래스의 인스턴스 변수 'id'를 가리킵니다. 이 줄은 생성자의 입력 매개변수 'id'를 클래스의 'id'에 할당합니다.
        this.name = name;
        // 'this.name'은 클래스의 인스턴스 변수 'name'을 가리킵니다. 이 줄은 생성자의 입력 매개변수 'name'를 클래스의 'name'에 할당합니다.
        this.grade = grade;
        // 'this.grade'는 클래스의 인스턴스 변수 'grade'를 가리킵니다. 이 줄은 생성자의 입력 매개변수 'grade'를 클래스의 'grade'에 할당합니다.
    }

    public Long getId() {
    // 'id' 변수의 값을 반환하는 public 메소드입니다. 외부에서 'id' 값을 조회할 수 있습니다.
        return id;
        // 클래스의 'id' 값을 반환합니다.
    }

    public void setId(Long id) {
    // 'id' 변수의 값을 설정하는 public 메소드입니다. 외부에서 'id' 값을 설정할 수 있습니다.
        this.id = id;
        // 'this.id'는 클래스의 인스턴스 변수 'id'를 가리킵니다. 이 줄은 입력 매개변수 'id'를 클래스의 'id'에 할당합니다.
    }

    public String getName() {
    // 'name' 변수의 값을 반환하는 public 메소드입니다. 외부에서 'name' 값을 조회할 수 있습니다.
        return name;
        // 클래스의 'name' 값을 반환합니다.
    }

    public void setName(String name) {
    // 'name' 변수의 값을 설정하는 public 메소드입니다. 외부에서 'name' 값을 설정할 수 있습니다.
        this.name = name;
        // 'this.name'는 클래스의 인스턴스 변수 'name'를 가리킵니다. 이 줄은 입력 매개변수 'name'를 클래스의 'name'에 할당합니다.
    }

    public Grade getGrade() {
    // 'grade' 변수의 값을 반환하는 public 메소드입니다. 외부에서 'grade' 값을 조회할 수 있습니다.
        return grade;
        // 클래스의 'grade' 값을 반환합니다.
    }

    public void setGrade(Grade grade) {
    // 'grade' 변수의 값을 설정하는 public 메소드입니다. 외부에서 'grade' 값을 설정할 수 있습니다.
        this.grade = grade;
        // 'this.grade'는 클래스의 인스턴스 변수 'grade'를 가리킵니다. 이 줄은 입력 매개변수 'grade'를 클래스의 'grade'에 할당합니다.
    }
}
package hello.core.member;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.

public interface MemberRepository {
// 이 줄은 'public' 접근 제어자를 사용하여 'MemberRepository'라는 인터페이스를 선언합니다. 인터페이스는 클래스가 구현해야 하는 메서드를 정의하며, 여기서 선언된 모든 메서드는 public이고 추상적입니다.

    void save(Member member); // 회원 등록
    // 'save' 메서드를 선언합니다. 이 메서드는 'Member' 타입의 객체를 매개변수로 받아 회원 정보를 저장하는 역할을 합니다. 반환 타입은 'void'입니다.

    Member findById(Long memberId); // 회원 조회
    // 'findById' 메서드를 선언합니다. 이 메서드는 'Long' 타입의 'memberId'를 매개변수로 받아 해당 ID의 회원 정보를 조회하고, 조회된 'Member' 객체를 반환합니다.
}
package hello.core.member;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.

import java.util.HashMap;
import java.util.Map;
// HashMap과 Map 클래스를 import합니다. 이들은 Java의 표준 라이브러리로, Map 인터페이스를 구현하는 HashMap을 사용하여 데이터를 키-값 쌍으로 저장합니다.

public class MemoryMemberRepository implements MemberRepository{
// 이 줄은 'MemoryMemberRepository' 클래스를 선언하며, 'MemberRepository' 인터페이스를 구현합니다.

    private static Map<Long, Member> store = new HashMap<>();
    // static 변수 'store'를 선언하고, HashMap 인스턴스로 초기화합니다. 이 맵은 'Long' 타입의 ID와 'Member' 객체를 연결하는 저장소 역할을 합니다.

    @Override
    public void save(Member member) {
    // 'save' 메서드를 오버라이드합니다. 이 메서드는 'Member' 객체를 매개변수로 받아 맵에 저장합니다.

        store.put(member.getId(), member);
        // 'store' 맵에 'member'의 'id'를 키로 하고, 'member' 객체 자체를 값으로 저장합니다.
    }

    @Override
    public Member findById(Long memberId) {
    // 'findById' 메서드를 오버라이드합니다. 이 메서드는 'Long' 타입의 'memberId'를 매개변수로 받아 해당 ID의 회원 정보를 맵에서 조회합니다.

        return store.get(memberId);
        // 'store' 맵에서 'memberId'에 해당하는 'Member' 객체를 반환합니다.
    }
}
package hello.core.member;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.

public interface MemberService {
// 이 줄은 'public' 접근 제어자를 사용하여 'MemberService'라는 인터페이스를 선언합니다. 인터페이스는 클래스가 구현해야 하는 메서드를 정의하며, 여기서 선언된 모든 메서드는 public이고 추상적입니다.

    void join(Member member);
    // 'join' 메서드를 선언합니다. 이 메서드는 'Member' 타입의 객체를 매개변수로 받아 회원 가입 로직을 처리합니다. 반환 타입은 'void'이며, 구현 클래스에서 상세 로직을 정의해야 합니다.

    Member findMember(Long memberId);
    // 'findMember' 메서드를 선언합니다. 이 메서드는 'Long' 타입의 'memberId'를 매개변수로 받아 해당 ID의 회원 정보를 조회하고, 조회된 'Member' 객체를 반환합니다. 이 메서드 역시 구현 클래스에서 상세 로직을 정의해야 합니다.
}
package hello.core.member;
// 이 줄은 패키지 이름을 선언합니다. 패키지는 Java에서 관련된 클래스와 인터페이스를 조직화하는 데 사용됩니다.

public class MemberServiceImpl implements MemberService {
// 이 줄은 'MemberServiceImpl' 클래스를 선언하고, 'MemberService' 인터페이스를 구현하도록 합니다. 이를 통해 이 클래스는 인터페이스에 정의된 모든 메소드를 구현해야 합니다.

    private final MemberRepository memberRepository = new MemoryMemberRepository();
    // 'final' 키워드로 선언된 'MemberRepository' 타입의 'memberRepository' 인스턴스 변수를 초기화하며, 이 변수에는 'MemoryMemberRepository'의 인스턴스가 할당됩니다. 이는 회원 정보의 저장과 조회를 메모리 기반의 저장소에서 수행하게 됩니다.

    @Override
    public void join(Member member) {
    // 'join' 메서드를 오버라이드합니다. 이 메서드는 'Member' 타입의 객체를 매개변수로 받아 회원 가입 처리를 합니다.

        memberRepository.save(member);
        // 'memberRepository'의 'save' 메서드를 호출하여, 매개변수로 받은 'member' 객체를 저장합니다.
    }

    @Override
    public Member findMember(Long memberId) {
    // 'findMember' 메서드를 오버라이드합니다. 이 메서드는 'Long' 타입의 'memberId'를 매개변수로 받아 해당 회원의 정보를 조회합니다.

        return memberRepository.findById(memberId);
        // 'memberRepository'의 'findById' 메서드를 호출하여, 매개변수로 받은 'memberId'에 해당하는 'Member' 객체를 반환합니다.
    }
}