[Spring Boot] [3] 2. 스프링 핵심 원리 이해 1_예제 만들기 (1)

윤경·2021년 8월 14일
1

Spring Boot

목록 보기
20/79
post-thumbnail

1️⃣ 프로젝트 생성

우선은 순수한 자바로만 프로젝트를 만들어보자!

사전 준비물

  • Java 11 설치
  • IDE: IntelliJ OR Eclipse 설치 (IntelliJ 권장)

📌(참고) 개발환경 만들기 이전 포스트

잠깐! ✋🏻이전 포스트에서 Java 11 이 아닌 8로 설치했기 때문에 Java 11을 다시 설치하도록 하겠다. 다음과 같이 따라하면 된다. (본인은 M1 환경임을 참고해주세요.)

brew tap AdoptOpenJDK/openjdk
brew install --cask adoptopenjdk11
/usr/libexec/java_home -v 1.11
java -version

⬇️ 스프링 프로젝트 생성할 링크에 접속해 프로젝트 생성 (GENERATE하면 압축 파일이 생기고 인텔리제이에서 열어주면 됨. 처음 프로젝트를 열 때는 시간이 엄청 소요됨!)

(참고) gradle의 무엇인가를 변경하면 항상 코끼리🐘 를 눌러줘야 함.

‼️ 나는 개인적으로 CoreApplication을 실행시켰더니 jdk 에러가 발생했다. 확실한 이유는 모르지만 깔려있던 8과 11 버전이 충돌했나,,?
그래서 8을 제거하고 (첨에 뭔지 모르겠어서 파일도 다시 처음부터 받아서 열고 온갖 삽질을 ☹️) 인텔리제이를 껐다 켰다.
우선, 제거하는 방법은 다음과 같다.

cd /Library/Java/JavaVirtualMachines/
$ ls

이렇게 되면 내가 깔았던 jdk를 볼 수 있다. 이제 지우자.
$ sudo rm -rf adoptopenjdk-8.jdk


⬆️ 된다 !!

이제, IntelliJ Gradle 대신에 자바를 직접 실행시키도록 설정하자.

최근 IntelliJ 버전은 Gradle을 통해서 실행하는 것이 기본 설정이다. 하지만 이 방법은 실행속도가 느리다.
다음과 같이 변경하면 자바로 바로 실행해서 실행속도가 더 빠르다.

- Preferences ➡️ Build, Execution, Deployment ➡️ Build Tools ➡️ Gradle
- Build and run using: Gradle ➡️ IntelliJ IDEA
- Run tests using: Gradle ➡️ IntelliJ IDEA


2️⃣ 비즈니스 요구사항 설계

  • 🧑🏻‍🦲 회원
    - 회원 가입, 조회
    - 회원은 일반 / VIP 두 가지 등급
    - 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)

  • 🧾 주문과 할인 정책
    - 회원은 상품을 주문할 수 있다.
    - 회원 등급에 따라 할인 정책을 적용할 수 있다.
    - 할인 정책: 모든 VIP는 1000원 할인되는 고정 금액 할인을 적용해달라. (변경 가능성 있음)
    - 할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않을 수도 있다. (미확정)

요구사항을 보면 회원 데이터, 할인 정책 같은 부분은 지금 결정하기 어려운 부분이다. 그렇다고 이런 정책이 결정될 때까지 개발을 무기한 미룰 수도 없다! 우리는 앞에서 배운 객체 지향 설계 방법을 쓸 것!
인터페이스를 만들고 구현체를 언제든지 갈아끼울 수 있도록 설계해보자.

(참고): 프로젝트 환경설정을 편하게 하기 위해 스프링 부트를 사용한 것. 지금은 스프링 없는 순수한 자바로만 개발을 진행할 것. (스프링은 한참 뒤에 등장)


3️⃣ 회원 도메인 설계

회원 도메인 협력 관계

회원 클래스 다이어그램

회원 객체 다이어그램

  • 회원 서비스: MemberServiceImpl

4️⃣ 회원 도메인 개발

✔️ hello.core 밑에 member 패키지 생성
✔️ 패키지 안에 Enum으로 Grade 클래스 생성

package hello.core.member;

public enum Grade {
    BASIC,
    VIP
}

✔️ member 패키지 밑에 Member.java 자바 클래스 생성

package hello.core.member;

public class Member {
    private Long id;
    private String name;
    private Grade grade;

    // 생성자
    public Member(Long id, String name, Grade grade) {
        this.id = id;
        this.name = name;
        this.grade = grade;
    }

    // getter, setter
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Grade getGrade() {
        return grade;
    }

    public void setGrade(Grade grade) {
        this.grade = grade;
    }
}

📌 preferences ➡️ keymap에서 검색하면 단축키 확인 가능한

그리고 preferences의 단축키는 command + ,(반점)

✔️ member 패키지 밑에 MemberRepository.java 인터페이스 생성

package hello.core.member;

public interface MemberRepository {
    
    void save(Member member);
    
    Member findById(Long memberId);
}

✔️ member 패키지 밑에 MemoryMemberRepository.java

원래 인터페이스와 구현체를 다른 패키지에 두는 것이 더 좋은 설계이지만 우리는 아직 배우는 단계이므로 (너무 복잡해져서) 같은 패키지에 두도록 하겠음!
(그리고 HashMap은 동시성 이슈가 생길 수 있어 실무에선 ConcurrentHashMap을 쓰지만 우린 예제이니까!)

package hello.core.member;

import java.util.HashMap;
import java.util.Map;

public class MemoryMemberReposiotry implements MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();

    @Override
    public void save(Member member) {
        store.put(member.getId(), member);
    }

    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }
}

✔️ member 패키지 밑에 MemberService.java 인터페이스 생성

package hello.core.member;

public interface MemberService {
    
    void join(Member member);
    
    Member findMember(Long memberId);
}

✔️ 이제 또 구현할 구현체 만들자. member 패키지 밑에 MemberServiceImpl.java 생성

package hello.core.member;

public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository = new MemoryMemberReposiotry();

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }

    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

📌 command + shift + enter: 탭키 칠 때 ; 까지 함께 넣어서 완성시키기


2편 원해요 ?
👥..: 네-!

profile
개발 바보 이사 중

0개의 댓글