DevLog ๐ถ
[Spring] ์์ ์๋ฐ๋ก ํ์-์ฃผ๋ฌธ ์๋น์ค ๊ฐ๋ฐํ๊ธฐ ๋ณธ๋ฌธ
[Spring] ์์ ์๋ฐ๋ก ํ์-์ฃผ๋ฌธ ์๋น์ค ๊ฐ๋ฐํ๊ธฐ
dolmeng2 2022. 8. 6. 19:27- ๊น์ํ ๋์ '์คํ๋ง ํต์ฌ์๋ฆฌ - ๊ธฐ๋ณธํธ'์ ๋ณด๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค ๐
| ๊ธฐ๋ณธ ์ค๊ณ
<ํ์ ๋๋ฉ์ธ>
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ์ด์ค-ํด๋์ค ํํ๋ก ์ค๊ณํ๊ธฐ.
- ๋ฌผ๋ก , ์ค๋ฌด์์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ์๋ ๋ฐ๋ก ํด๋์ค๋ก ๋ค์ด๊ฐ๋ ์ข๋ค. ์ง๊ธ์ ์ฐ์ต์ด๋๊น!
- ํ์์ id, ์ด๋ฆ, ๋ฑ๊ธ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ์ด๋, ๋ฑ๊ธ ์ ๋ณด๋ BASIC / VIP ์ ์ ๋ก ๋๋์ด์ ธ ์๋ค.
- ํ์ ์๋น์ค๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ํ์๊ฐ์
- ํ์ ์กฐํ
- ํ์ ์ ์ฅ์๋ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ์, DB ์ ์ฅ์, ์ธ๋ถ ์์คํ ์ฐ๋ ์ ์ฅ์๋ก ๊ตฌํํ ์ ์๋๋ก ์ธํฐํ์ด์ค๋ฅผ ์ค๊ณํ๋ค.
- Spring ๋ด๋ถ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์, ๋ณ๋ค๋ฅธ dependency ์ถ๊ฐ๋ ์งํํ์ง ์์๋ค.
| Member
โ Domain
[Member.java]
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๋ ์๋ตํ์๋ค.
[Grade.java]
public enum Grade {
BASIC, VIP
}
โ Repository
[MemberRepository.java]
public interface MemberRepository {
void save(Member member);
Member findById(Long memberId);
}
[MemoryMemberRepository.java]
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new ConcurrentHashMap<>();
@Override
public void save(Member member) {
store.put(member.getId(), member);
}
@Override
public Member findById(Long memberId) {
return store.get(memberId);
}
}
- ๋์์ฑ ์ด์ ๋๋ฌธ์ ConcurrentHashMap์ ์ฌ์ฉํ์๋ค.
โ Service
[MemberService.java]
public interface MemberService {
void join(Member member);
Member findMember(Long memberId);
}
[MemberServiceImpl.java]
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);
}
}
โ Test
[MemberServiceTest.java]
class MemberServiceTest {
MemberService memberService = new MemberServiceImpl();
@Test
public void join() throws Exception {
// given
Member member = new Member(1L, "hello", Grade.BASIC);
// when
memberService.join(member);
// then
Member findMember = memberService.findMember(1L);
Assertions.assertThat(findMember).isEqualTo(member);
}
}
- ํ ์คํธ๋ ์ ํต๊ณผํ๋ค.
- ๊ทธ๋ฌ๋, ๊ธฐ๋ณธ์ ์ผ๋ก MemberService๋ฅผ ์ ์ธํ ๋ MemberServiceImpl() ์ด๋ผ๋ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ๊ณ ์๋ค.
- ์ด๋ ๊ฒ ๋๋ฉด ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์์กดํ๊ธฐ ๋๋ฌธ์ DIP ์๋ฐ, ์ดํ ์๋น์ค ์ ์ฑ ์ ๋ณ๊ฒฝํ ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ OCP๊น์ง ์๋ฐํ๊ฒ ๋๋ค.
- ์ฐ์ , ์ ๋ฌธ์ ๋ฅผ ๊ธฐ์ตํด๋๊ณ ์ฃผ๋ฌธ์ ๋ํ ๋๋ฉ์ธ์ ์ค๊ณํด๋ณด์.
- ๋ง์ฐฌ๊ฐ์ง๋ก ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํ๊ธฐ ์ํด, ์ธํฐํ์ด์ค-ํด๋์ค ํํ๋ก ์ค๊ณํ๋ค.
- ์ฃผ๋ฌธ์ ํ์ ID, ์ํ๋ช , ์ํ ๊ฐ๊ฒฉ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ์ฌ๊ธฐ์, ์ถ๊ฐ์ ์ผ๋ก ํ ์ธ๋ ๊ฐ๊ฒฉ์ ๋ฆฌํดํด์ฃผ๋ ํจ์๋ฅผ ์ ์ฉํ ์์ ์ด๋ค.
- ์ฃผ๋ฌธ ์๋น์ค๋ ํ์์ ์กฐํํ์ฌ ์ฌ์ฉ์๊ฐ ์ง๋ถํ ๊ฐ๊ฒฉ์ ๊ณ์ฐํ๋ค. VIP๋ ํ ์ธ์ ๋ฐ์ ์ ์๋ค.
- ์ด๋, ํ ์ธ ์ ์ฑ ์ ์ ์ก ํ ์ธ ์ ์ฑ (1000์), ์ ๋ฅ ํ ์ธ ์ ์ฑ ์ผ๋ก ๋๋๋ค.
| Discount
[DiscountPolicy.java]
public interface DiscountPolicy {
int discount(Member member, int price);
}
[FixDiscountPolicy.java]
public class FixDiscountPolicy implements DiscountPolicy{
private int fixDiscountPrice = 1000;
// 1000์์ ๊ณ ์ ์ผ๋ก ํ ์ธํด์ฃผ๊ธฐ
@Override
public int discount(Member member, int price) {
if(member.getGrade() == Grade.VIP) {
return fixDiscountPrice;
}
else {
return 0;
}
}
}
- ๋จผ์ ์ ์ก ํ ์ธ ์ ์ฑ ์ ๊ตฌํํ์๋ค. ํ ์ธ ๊ธ์ก์ 1000์์ด๋ค.
| Order
โ Domain
[Order.java]
public class Order {
private Long memberId;
private String itemName;
private int itemPrice;
private int discountPrice;
public int realPrice() {
return itemPrice - discountPrice;
}
}
- ์ฝ๋์์๋ ์๋ตํ์ง๋ง, Getter/Setter, ๊ทธ๋ฆฌ๊ณ toString์ ๋ฃ์ด์ฃผ์๋ค.
- ์ค์ ์ฌ์ฉ์๊ฐ ์ง๋ถํ ๊ฐ๊ฒฉ์ ๋ฆฌํดํด์ฃผ๊ธฐ ์ํด์ realPrice()๋ผ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์๋ค.
โ Service
[OrderService.java]
public interface OrderService {
Order createOrder(Long memberId, String itemName, int itemPrice);
}
[OrderServiceImpl.java]
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 findMember = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(findMember, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}
๐ ์ฌ๊ธฐ์ DiscountPolicy๋ฅผ ์ฃผ์ ํ๋ ๋ถ๋ถ์ ์ ๋ณด์. ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ๊ณ ์๋ค. (๋ค์์ ์ค๋ช ํ ์์ )
- id๋ฅผ ๋ฐํ์ผ๋ก ํ์์ ์ฐพ์์, ํ์์ ๋ฐ๋ฅธ ํ ์ธ ๊ฐ๊ฒฉ์ ๋ฆฌํด๋ฐ๋๋ค.
- ํด๋น ํ ์ธ๊ฐ๊ฒฉ์ด ์ ์ฉ๋ ์๋ก์ด ์ฃผ๋ฌธ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
โ Test
class OrderServiceTest {
MemberService memberService = new MemberServiceImpl();
OrderService orderService = new OrderServiceImpl();
@Test
public void createOrder() throws Exception {
// given
Member member = new Member(1L, "hello", Grade.VIP);
memberService.join(member);
// when
Order itemA = orderService.createOrder(1L, "itemA", 10000);
// then
// 10000์์์ 1000์ ํ ์ธ๋ฐ์์ผ๋๊น 9000์!
Assertions.assertThat(itemA.realPrice()).isEqualTo(9000);
}
}
- ํ ์คํธ ๊ฒฐ๊ณผ ๋งค์ฐ ์ ๋์๊ฐ๋ค.
- ๊ทธ๋ฌ๋, ์ ์ฝ๋์ ๊ฒฝ์ฐ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์์กดํ๊ณ ์๋ค๋ ๋จ์ ์ด ์๋ค.
- ๋ํ, ์์ง ์๋ก์ด ํ ์ธ ์ ์ฑ - ์ ๋ฅ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํ์ง ์์ ์ํ์ด๋ค.
- ์ธํฐํ์ด์ค - ํด๋์ค ์ค๊ณ ๋๋ถ์ ์ฐ๋ฆฌ๋ ๊ทธ๋ฅ ์ ๋ฅ ํ ์ธ ์ ์ฑ ์ ๋ํ ํด๋์ค๋ฅผ ์์ฑํ ๋ค, ์ ์ฉํด์ฃผ๋ฉด ๋๋ค!
[RateDiscountPolicy.java]
public class RateDiscountPolicy implements DiscountPolicy{
private int discountPercent = 10; // 10% ํ ์ธ
@Override
public int discount(Member member, int price) {
if(member.getGrade() == Grade.VIP) {
return price * discountPercent / 100;
}
else
return 0;
}
}
- VIP์ ๊ฒฝ์ฐ 10% ํ ์ธ์ ์งํํด์ค๋ค.
โ Test
[RateDiscountPolicyTest.java]
class RateDiscountPolicyTest {
RateDiscountPolicy discountPolicy = new RateDiscountPolicy();
@Test
public void vip1() throws Exception {
// given
Member memberVIP = new Member(1L,"VIP", Grade.VIP);
Member memberBASIC = new Member(2L, "BASIC", Grade.BASIC);
// when
int disVIP = discountPolicy.discount(memberVIP, 10000);
int disBASIC = discountPolicy.discount(memberBASIC, 10000);
// then
Assertions.assertThat(disVIP).isEqualTo(1000);
Assertions.assertThat(disBASIC).isEqualTo(0);
}
}
- ๋ง์ฐฌ๊ฐ์ง๋ก ํ ์คํธ๋ ์ ๋์๊ฐ๋ค.
- ๊ทธ๋ฌ๋, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ํ ์ธ์ ์ฑ ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ OrderServiceImpl์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค.
- ์ฐ๋ฆฌ๊ฐ ๊ธฐ์กด์ ์งฐ๋ ์ฝ๋์ ๊ฒฝ์ฐ, DiscountPolicy๊ฐ ๊ตฌ์ฒด ํด๋์ค์ธ FixDiscountPolicy๋ฅผ ์์กดํ๊ธฐ ๋๋ฌธ.
- ์ด๋ฐ ์์ผ๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ฌ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ๊ฒ์ OCP ์๋ฐ์ด๋ฉฐ, ๊ตฌ์ฒด ํด๋์ค ์์กด์ผ๋ก ์ธํ DIP ์ญ์ ์๋ฐ์ด๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ์ค์ง ์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด๋ณด์.
- ๊ทธ๋ฌ๋, ๋จ์ํ = new FixDiscountPolicy(); ๋ฅผ ์์ ๋ฒ๋ฆฐ๋ค๋ฉด... NPE๊ฐ ๋ฐ์ํ๋ค.
- ๋น์ฐํ๋ค. ๊ตฌํ์ฒด๊ฐ ์๋๋ฐ ์ฝ๋๋ฅผ ์คํํ ์ ์์ผ๋๊น.
- ์ฐ๋ฆฌ๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ์์ฑํ๊ณ ์ฃผ์ ํด์ฃผ๋ ์ญํ ์ ํด์ฃผ๋ Configuration ํ์ผ์ ๋ง๋ค์ด๋ณผ ๊ฒ์ด๋ค.
- ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ฅผ ์ํด, Configuration ์ญ์ ๋ฐ๋ก ํด๋์ค๋ฅผ ๋ง๋ค์ด ์งํํด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
| ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
- ์คํ๋๋ ๊ฐ์ฒด๋ค์ ์ด๋ค ๊ตฌํ์ฒด๊ฐ ์ฃผ์ ๋๋์ง ์ ์ ์์ด์ผ ํ๋ค. ๊ทธ์ ๊ฐ์์ ์ญํ ์ ์ถฉ์คํด์ผ ํ๋ค.
[AppConfig.java]
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(
new MemoryMemberRepository(),
new FixDiscountPolicy()
);
}
}
- ์ฝ๋๋ฅผ ๋ณด๋ฉด, MemberServiceImpl์ ๋ํ ๊ตฌ์ฒด์ ์ธ MemberRepository ๊ตฌํ์ฒด๋ฅผ ์ฌ๊ธฐ์์ ์ฃผ์ ํ๋ ๊ฑธ ๋ณผ ์ ์๋ค.
- ์ค์ ๋์์ ํ์ํ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ค๋ค. ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ๊ฑด ๋ฌด์กฐ๊ฑด AppConfig์์ ์งํํ๋ค!
- ์ด๋ฐ ์์ผ๋ก ์์ฑ์๋ฅผ ํตํด ๋ฃ์ด์ฃผ๋ ๊ฑธ '์์ฑ์ ์ฃผ์ ' ์ด๋ผ๊ณ ํ๋ค.
- ์ด์ , AppConfig์ ์ ์ธ๋ memberService()๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- orderService() ์ญ์ ์ธ๋ถ์ ์ธ MemberRepository์ DiscountPolicy์ ๋ํ ๊ตฌํ์ฒด๋ฅผ ์ฌ๊ธฐ์์ ๋ฃ์ด์ฃผ์๋ค.
๐ ๊ทธ๋ฌ๋, ํ์ฌ ์ฝ๋์์ MemoryMemberRepository()๋ฅผ 2๋ฒ ์ ์ธํ๋ ๋ฑ, ์ค๋ณต์ด ์กด์ฌํ๋ ๊ฑธ ๋ณผ ์ ์๋ค.
- ์ด ๋ถ๋ถ์ ๋ํด์๋ ๋ค์์ ํด๊ฒฐํด๋ณด๋๋ก ํ์.
โ ๊ธฐ์กด์ ์ ์ธํ์๋ ์ฝ๋ ์์
[MemberServiceImpl.java]
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Override
public void join(Member member) {
memberRepository.save(member);
}
@Override
public Member findMember(Long memberId) {
return memberRepository.findById(memberId);
}
}
- memberRepository = new MemoryMemberRepository()๋ฅผ ์ญ์ ํ๊ณ , ์์ฑ์๋ฅผ ํตํด memberRepository์ ์ฃผ์ ๋ฐ๋๋ก ํ์๋ค.
- ์ด๋ฌ๋ฉด, memberRepository๋ ๋ ์ด์ ๊ตฌํ์ฒด๋ฅผ ์์กดํ์ง ์๊ฒ ๋๋ค!
[OrderServiceImpl.java]
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member findMember = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(findMember, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}
- ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณ๊ฒฝํด์ฃผ์๋ค. OrderServiceImpl์ ์ด๋ค ํ ์ธ ์ ์ฑ ์ด ๋ค์ด์ค๋์ง, ์ด๋ค DB ์ ๊ทผ ๊ธฐ์ ์ด ๋ค์ด์ค๋์ง ๋ชจ๋ฅธ๋ค!
- ์ด์ , ๊ฐ Impl๋ค์ ์์กด๊ด๊ณ์ ๋ํ ๊ฑด ์ธ๋ถ์ ๋๊ธฐ๊ณ , ์ค์ง ๋ก์ง๋ง ์คํํ๋ฉด ๋๋ค.
๐ฉ ์ด๋ ๊ฒ, DIP๋ฅผ ๋ง์กฑํ๊ฒ ๋์๋ค. Impl๋ค์ ์ค์ง ์ถ์ํ๋ ์ธํฐํ์ด์ค์๋ง ์์กดํ๋ค.
โ Test ์ฝ๋ ์์
[MemberServiceTest.java]
class MemberServiceTest {
MemberService memberService;
@BeforeEach
public void beforeEach() {
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();
}
@Test
public void join() throws Exception {
// given
Member member = new Member(1L, "hello", Grade.BASIC);
// when
memberService.join(member);
// then
Member findMember = memberService.findMember(1L);
Assertions.assertThat(findMember).isEqualTo(member);
}
}
- @BeforeEach๋ฅผ ํตํด, ๊ฐ ํ ์คํธ๋ฅผ ํธ์ถํ๊ธฐ ์ ์ AppConfig๋ฅผ ์ ์ธํ์ฌ ๋ด๋ถ์ memberService๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํ์๋ค.
[OrderServiceTest.java]
class OrderServiceTest {
MemberService memberService;
OrderService orderService;
@BeforeEach
public void beforeEach() {
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();
orderService = appConfig.orderService();
}
@Test
public void createOrder() throws Exception {
// given
Member member = new Member(1L, "hello", Grade.VIP);
memberService.join(member);
// when
Order itemA = orderService.createOrder(1L, "itemA", 10000);
// then
// 10000์์์ 1000์ ํ ์ธ๋ฐ์์ผ๋๊น 9000์!
Assertions.assertThat(itemA.realPrice()).isEqualTo(9000);
}
}
- ๋ค ์ข์๋ฐ, AppConfig๋ฅผ ์กฐ๊ธ ๋ ๊น๋ํ๊ฒ ๊ด๋ฆฌํด๋ณด์.
[AppConfig.java]
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy()
);
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy() {
//return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
- ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋๋ก MemberRepository์ DiscountPolicy์ ๋ํ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ถ๋ถ์ ๋ฐ๋ก ํจ์๋ก ๋บ๋ค.
- ์ดํ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋๋ผ๋ memberRepository(), discountPolicy() ๋ด๋ถ๋ง ๋ฐ๊พธ์ด ์ฃผ๋ฉด ๋๋ค!
- ์ด๋ ๊ณง, Service๋ Service๋ง, Repository๋ Repository๋ง ๊ด๋ฆฌํ๊ฒ ๋์ด ์กฐ๊ธ ๋ ๋ช ํํ๊ฒ ์ญํ ๊ณผ ๊ตฌํ ํด๋์ค๋ฅผ ํ๋์ ํ์ธํ ์ ์๋ค.
- ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ SOLID๋ฅผ ๋ง์กฑํ๊ธฐ ์ํด์ ์ฌ๋ฌ ๊ฐ์ง ์๋๋ฅผ ํ๋ค.
- SRP : ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํด์ ๊ตฌํ ๊ฐ์ฒด์ ์์ฑ ๋ฐ ์ฐ๊ฒฐ์ AppConfig์ผ๋ก, ๊ฐ ๊ฐ์ฒด๋ ๋ก์ง์๋ง ์ง์คํ๋๋ก.
- DIP : ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ์ง ์๋๋ก AppConfig๊ฐ ๋์ ํด๋ผ์ด์ธํธ ์ฝ๋์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ์๋ค.
- OCP : Fix<->Rate๋ก ํ ์ธ ์ ์ฑ ์ ๋ณ๊ฒฝํ๋๋ผ๋ ํด๋ผ์ด์ธํธ ์ฝ๋์ ๋ณ๊ฒฝ ์์ด AppConfig๋ง ์์ ํ์๋ค.
- ์ด์ , ์์ ์๋ฐ๋ง์ ์ด์ฉํ์ง ์๊ณ ์คํ๋ง์ ํตํด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ฐ๋ฐ์ ์์ํด๋ณด์!
'Back-end > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] WAS, ์๋ธ๋ฆฟ, ๋ฉํฐ ์ค๋ ๋์ ์ค๋ ๋ ํ (0) | 2022.08.08 |
---|---|
[Spring] ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ, ๋น ์ค์ฝํ (0) | 2022.08.07 |
[Spring] ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์์กด๊ด๊ณ ์๋ ์ฃผ์ (0) | 2022.08.07 |
[Spring] ์คํ๋ง์ ์ด์ฉํด ํ์-์ฃผ๋ฌธ ์๋น์ค ๊ฐ๋ฐ, ์คํ๋ง ์ปจํ ์ด๋์ ์ฑ๊ธํค (0) | 2022.08.06 |
[Spring] ์คํ๋ง์ด๋? (3) | 2022.08.06 |