[Spring] 2.์คํ๋ง ํต์ฌ ์๋ฆฌ ์ดํด1 - ์์ ๋ง๋ค๊ธฐ
1. ํ๋ก์ ํธ ์์ฑ
- java11, Intelli J
- ์คํ๋ง ๋ถํธ https://start.spring.io
Gradle / Java / ๋ฒ์ (๊ฐ์ฅ์์ ํ๋ ์ต์ ๋ฒ์ ) -> ์ค๋ฅ๋์ 2.7 ๋ฒ์ ๋๋กํจ
group(hello)
artifact(core) - ํ๋ก์ ํธ ์ด๋ฆ
packaging (jar war ์ค์ jar)
java 11
dependcies ์ ํ X
-> generate
> ์์ถํ๊ณ Application ์คํํ๊ธฐ
> Preferences - Gradle - build and run using / run tests using ๋ ๋ค ์ธํ ๋ฆฌ์ ์ด๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ (ํ)
2. ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ๊ณผ ์ค๊ณ
ํ์
- ํ์ ๊ฐ์ ์กฐํ ๊ฐ๋ฅ
- ํ์ ๋ฑ๊ธ ์ผ๋ฐ/VIP
- ํ์ ๋ฐ์ดํฐ๋ ์์ฒด DB ๊ตฌ์ถํ ์ ์๊ณ ์ธ๋ถ์์คํ
๊ณผ ์ฐ๋ ๊ฐ๋ฅ (๋ฏธํ์ )
์ฃผ๋ฌธ๊ณผ ํ ์ธ ์ ์ฑ
- ํ์์ ์ํ์ ์ฃผ๋ฌธํ ์ ์๋ค.
- ํ์ ๋ฑ๊ธ์ ๋ฐ๋ผ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํ ์ ์๋ค.
- ํ ์ธ ์ ์ฑ ์ ๋ชจ๋ VIP๋ 1000์์ ํ ์ธํด์ฃผ๋ ๊ณ ์ ๊ธ์ก ํ ์ธ์ ์ ์ฉํด๋ฌ๋ผ
- ํ ์ธ ์ ์ฑ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ๋๋ค -> ์ต์ ์ ๊ฒฝ์ฐ ํ ์ธ ์ ์ฉ ์ํ ์๋์๋ค. (๋ฏธํ์ )
์๊ตฌ์ฌํญ์ ๋ณด๋ฉด ์ง๊ธ ์ ํ์ง ๋ชปํ๋ ๊ฒ๋ค์ด ์๋ค.
-> ๊ฐ์ฒด ์งํฅ ์ค๊ณ ๋ฐฉ๋ฒ ํ์ฉ
<< ์คํ๋ง ํ๋ ์์ํฌ ์์ด ์ฝ๋ฉ >>
3. ํ์ ๋๋ฉ์ธ ์ค๊ณ
ํ์ ๋๋ฉ์ธ ์๊ตฌ์ฌํญ
- ํ์์ ๊ฐ์ ํ๊ณ ์กฐํํ ์ ์๋ค.
- ํ์์ ์ผ๋ฐ๊ณผ vip ๋ฑ๊ธ ๋ ๊ฐ
- ํ์ ๋ฐ์ดํฐ๋ ์์ฒด DB ๊ตฌ์ถํ ์๋์๊ณ , ์ธ๋ถ ์์คํ ๊ณผ ์ฐ๋ํ ์ ์๋ค. (๋ฏธํ์ )
[ํ์ ๋๋ฉ์ธ ํ๋ ฅ ๊ด๊ณ]
[ํ์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ]
[ํ์ ๊ฐ์ฒด ๋ค์ด์ด๊ทธ๋จ]
4. ํ์ ๋๋ฉ์ธ ๊ฐ๋ฐ
[ํ์ ์ํฐํฐ]
ใด hello.cored.member
ํ์ ๋ฑ๊ธ (Enum)
public enum Grade {
BASIC,
VIP
}
ํ์ ์ํฐํฐ(Class)
package hello.cored.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;
}
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;
}
}
[ํ์ ์ ์ฅ์]
ใด hello.cored.member
ํ์ ์ ์ฅ์ ์ธํฐํ์ด์ค(Interface)
public interface MemberRepository {
void save(Member member);
Member findById(Long memberId);
}
๋ฉ๋ชจ๋ฆฌ ํ์ ์ ์ฅ์ ๊ตฌํ์ฒด(Class)
public class MemoryMemberRepository 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);
}
}
[ํ์ ์๋น์ค]
ใด hello.cored.member
ํ์ ์๋น์ค ์ธํฐํ์ด์ค(Interface)
public interface MemberService {
void join(Member member);
Member findMember(Long memberId);
}
ํ์ ์๋น์ค ๊ตฌํ์ฒด(Class)
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository = new MemoryMemberRepository();
@Override
public void join(Member member) {
memberRepository.save(member);
}
@Override
public Member findMember(Long memberId) {
return memberRepository.findById(memberId);
}
}
5. ํ์ ๋๋ฉ์ธ ์คํ๊ณผ ํ ์คํธ
ํ์ ๋๋ฉ์ธ - ํ์ ๊ฐ์ main
ใด hello.cored
MemberApp(Class)
public class MemberApp {
public static void main(String[] args) {
MemberService memberService = new MemberServiceImpl();
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("findMember = " + findMember.getName());
System.out.println("member = " + member.getName());
}
}
-> ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ผ๋ก ์ด๋ ๊ฒ ํ ์คํธ ํ๋ ๊ฒ์ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ค.
-> JUnit ํ ์คํธ๋ฅผ ์ฌ์ฉํ์.
ํ์ ๋๋ฉ์ธ - ํ์ ๊ฐ์ ํ ์คํธ
ใด hello.cored.member (test์ ํ์ํด๋)
MemberServiceTest(Class)
public class MemberServiceTest {
MemberService memberService = new MemberServiceImpl();
@Test
void join() {
// given
Member member = new Member(1L, "memberA", Grade.VIP);
// when
memberService.join(member);
Member findMember = memberService.findMember(1L);
// then
Assertions.assertThat(member).isEqualTo(findMember);
}
}
* Assertions -> org.assertj.core.api ์ฌ์ฉํ๋ฉด ๋จ
ํ์ ๋๋ฉ์ธ ์ค๊ณ์ ๋ฌธ์ ์
- ์ด ์ฝ๋์ ์ค๊ณ์ ๋ฌธ์ ์ ์ ๋ฌด์์ผ๊น์?
- ๋ค๋ฅธ ์ ์ฅ์๋ก ๋ณ๊ฒฝํ ๋ OCP ์์น์ ์ ์ค์ํ ๊น์?
- DIP๋ฅผ ์ ์งํค๊ณ ์์๊น์?
- ์์กด๊ด๊ณ๊ฐ ์ธํฐํ์ด์ค ๋ฟ๋ง ์๋๋ผ ๊ตฌํ๊น์ง ๋ชจ๋ ์์กดํ๋ ๋ฌธ์ ์ ์ด ์์
- ์ฃผ๋ฌธ๊น์ง ๋ง๋ค๊ณ ๋์ ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ ๋ฐฉ์์ ์ค๋ช
6. ์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ ์ค๊ณ
์ฃผ๋ฌธ๊ณผ ํ ์ธ ์ ์ฑ
- ํ์์ ์ํ์ ์ฃผ๋ฌธํ ์ ์๋ค.
- ํ์ ๋ฑ๊ธ์ ๋ฐ๋ผ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํ ์ ์๋ค.
- ํ ์ธ ์ ์ฑ ์ ๋ชจ๋ VIP 1000์ ํ ์ธ (๋์ค์ ๋ณ๊ฒฝ ๊ฐ๋ฅ)
- ํ ์ธ ์ ์ฑ ์ ๋ณ๊ฒฝ๊ฐ๋ฅ์ฑ ๋๋ค. ์ํ ์๋์๋ค. (๋ฏธํ์ )
[์ฃผ๋ฌธ ๋๋ฉ์ธ ํ๋ ฅ, ์ญํ , ์ฑ ์]
1) ์ฃผ๋ฌธ ์์ฑ : ํด๋ผ์ด์ธํธ๋ ์ฃผ๋ฌธ ์๋น์ค์ ์ฃผ๋ฌธ ์์ฑ์ ์์ฒญํ๋ค.
2) ํ์ ์กฐํ : ํ ์ธ์ ์ํด์๋ ํ์ ๋ฑ๊ธ์ด ํ์ / ๊ทธ๋์ ์ฃผ๋ฌธ ์๋น์ค๋ ํ์ ์ ์ฅ์์์ ํ์์ ์กฐํ
3) ํ ์ธ ์ ์ฉ : ์ฃผ๋ฌธ ์๋น์ค๋ ํ์ ๋ฑ๊ธ์ ๋ฐ๋ฅธ ํ ์ธ ์ฌ๋ถ๋ฅผ ํ ์ธ ์ ์ฑ ์ ์์
4) ์ฃผ๋ฌธ ๊ฒฐ๊ณผ ๋ฐํ : ์ฃผ๋ฌธ ์๋น์ค๋ ํ ์ธ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ ์ฃผ๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
[์ฃผ๋ฌธ ๋๋ฉ์ธ ์ ์ฒด]
- ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ -> ์์ ๋กญ๊ฒ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์กฐ๋ฆฝํ ์ ์๊ฒ ์ค๊ณ / ๋๋ถ์ ํ์ ์ ์ฅ์, ํ ์ธ ์ ์ฑ ์ ์ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ
[์ฃผ๋ฌธ ๋๋ฉ์ธ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ]
[์ฃผ๋ฌธ ๋๋ฉ์ธ ๊ฐ์ฒด ๋ค์ด์ด๊ทธ๋จ1]
- ํ์์ ๋ฉ๋ชจ๋ฆฌ์์ ์กฐํํ๊ณ ์ ์ก ํ ์ธ ์ ์ฑ (๊ณ ์ ๊ธ์ก)์ ์ง์ํด๋ ์ฃผ๋ฌธ ์๋น์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค.
- ์ญํ ๋ค์ ํ๋ ฅ ๊ด๊ณ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
[์ฃผ๋ฌธ ๋๋ฉ์ธ ๊ฐ์ฒด ๋ค์ด์ด๊ทธ๋จ2]
- ํ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ์ค์ DB์์ ์กฐํ, ํ ์ธ ์ ์ฑ (์ฃผ๋ฌธ ๊ธ์ก์ ๋ฐ๋ผ %ํ ์ธ)์ ์ง์ํด๋ ์ฃผ๋ฌธ์๋น์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค.
7. ์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ ๊ฐ๋ฐ
ํ ์ธ
ใดhello.cored.discount
ํ ์ธ ์ ์ฑ ์ธํฐํ์ด์ค(Interface)
public interface DiscountPolicy {
int discount(Member memeber, int price);
}
์ ์ก ํ ์ธ ์ ์ฑ ๊ตฌํ์ฒด(Class)
public class FixDiscountPolicy implements DiscountPolicy {
private int discountFixAmount = 1000;
@Override
public int discount(Member member, int price) {
if(member.getGrade() == Grade.VIP){
return discountFixAmount;
}
return 0;
}
}
์ฃผ๋ฌธ
ใดhello.cored.order
์ฃผ๋ฌธ ์ํฐํฐ(Class)
public class Order {
private Long memberId;
private String itemName;
private int itemPrice;
private int discountPrice;
public Order(Long memberId, String itemName, int itemPrice, int discountPrice) {
this.memberId = memberId;
this.itemName = itemName;
this.itemPrice = itemPrice;
this.discountPrice = discountPrice;
}
public int caculatePrice(){
return itemPrice - discountPrice;
}
public Long getMemberId() {
return memberId;
}
public void setMemberId(Long memberId) {
this.memberId = memberId;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public int getItemPrice() {
return itemPrice;
}
public void setItemPrice(int itemPrice) {
this.itemPrice = itemPrice;
}
public int getDiscountPrice() {
return discountPrice;
}
public void setDiscountPrice(int discountPrice) {
this.discountPrice = discountPrice;
}
@Override
public String toString() {
return "Order{" +
"memberId=" + memberId +
", itemName='" + itemName + '\'' +
", itemPrice=" + itemPrice +
", discountPrice=" + discountPrice +
'}';
}
}
- ์ต์ข ๊ณ์ฐ๋ ๊ธ์ก ๋ฐํํ๋ caculatePrice๊ฐ ์์
- ๊ฒฐ๊ณผ ๋ณด๊ธฐ์ฝ๊ฒ toString @Override ํด์ฃผ๊ธฐ (์ด๊ฒ๋ cmd + N)
์ฃผ๋ฌธ ์๋น์ค ์ธํฐํ์ด์ค(Interface)
public interface OrderService {
Order createOrder(Long memberId, String itemName, int itemPrice);
}
์ฃผ๋ฌธ ์๋น์ค ๊ตฌํ(Class)
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}
- SOLID ๋จ์ผ ์ฑ ์ ์์น(SRP) ์ ์ง์ผ์ง ๊ฒ -> ํ ์ธ์ ๋ํ๊ฑฐ discount๊ฐ ๋ด๋นํ๊ธฐ ๋๋ฌธ์
8. ์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ ์คํ๊ณผ ํ ์คํธ
์ฃผ๋ฌธ๊ณผ ํ ์ธ ์ ์ฑ ์คํ
OrderApp(Class)
public class OrderApp {
public static void main(String[] args) {
MemberService memberService = new MemberServiceImpl();
OrderService orderService = new OrderServiceImpl();
long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
System.out.println("order = " + order);
}
}
test
class OrderServiceTest {
MemberService memberService = new MemberServiceImpl();
OrderService orderService = new OrderServiceImpl();
@Test
void createOrder() {
long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);
}
}
'๐จโ๐ป Web Development > Spring - ๊ธฐ๋ณธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] 6.์ปดํฌ๋ํธ ์ค์บ (0) | 2023.02.24 |
---|---|
[Spring] 5.์ฑ๊ธํค ์ปจํ ์ด๋ (0) | 2023.02.22 |
[Spring] 4.์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น (0) | 2023.02.20 |
[Spring] 3.์คํ๋ง ํต์ฌ ์๋ฆฌ ์ดํด2 - ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ (0) | 2023.02.18 |
[Spring] 1.๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง (0) | 2023.02.16 |
์ต๊ทผ๋๊ธ