This is an example custom assistant that will help you complete the Java onboarding in JetBrains. After trying it out, feel free to experiment with other blocks or create your own custom assistant.
mistral
gemini
Response in Korean
DDL에 해당하는 JPA 자바 엔티티 클래스를 만들어줘. Comment는 @Comment("xx")로 만들어서 컬럼 위에 적어줘.
@Column은 사용하지 마.
주석은 필요없어.
클래스 내부에는 @Id, @GeneratedValue, @Comment, @ManyToOne, @OneToOne, @OneToMany 어노테이션을 제외한 어떤 어노테이션도 사용하지 마.
아래의 조건을 모두 지켜서 문서의 내용을 요약해줘.
> 응답은 요약된 내용만 제공할 것.
> 모든 내용은 문서의 내용만을 기반으로 할 것. 인터넷에서 검색한 내용을 사용하면 안됨.
> 모든 문장은 음슴체로 끝낼 것.
> 문장 앞에 숫자를 사용하지 말고 '-'을 사용할 것.
> 중요한 부분을 `을 사용해 강조할 것.
예시)
- `객체 지향 설계`는 유연하고 확장 가능하며 유지보수가 용이한 코드를 작성하는 것을 목표로 함.
- `스프링`은 `자바` 기반의 애플리케이션 개발을 지원하는 `프레임워크`로, 객체 지향 설계의 원칙을 기반으로 함.
- `좋은 객체 지향 설계의 원칙`은 `SOLID 원칙`으로 요약됨.
- `SOLID 원칙`은 단일 책임 원칙(`SRP`), 개방-폐쇄 원칙(`OCP`), 리스코프 치환 원칙(`LSP`), 인터페이스 분리 원칙(`ISP`), 의존 역전 원칙(`DIP`)을 포함함.
- 스프링은 `의존성 주입`(Dependency Injection)과 같은 기술을 통해 `객체 간 결합도를 낮춰` 유연한 설계를 지원함.
- 스프링의 핵심 철학은 `객체 간의 느슨한 결합`과 `테스트 용이성`을 지향하는 것임.
아래의 조건을 모두 지켜서 문서의 내용을 요약해줘.
> 응답은 요약된 내용만 제공할 것.
> 모든 내용은 문서의 내용만을 기반으로 할 것. 인터넷 검색이나 문서에 없는 내용은 포함되면 안 됨.
> 모든 문장은 음슴체로 끝낼 것.
> 내용을 최대한 자세히 설명할 것.
> 글머리 기호('-')와 숫자를 사용할 것.
> 제목(# 1., # 2.)은 2개 이상 존재할 것.
> 제목은 2단계만 사용할 것. ex) '1.1.1' 사용하지 말 것
> 문서 내의 모든 예제 코드를 package문, import문 제외하고 추출해서 포함시킬 것. (예제 코드가 없다면 포함시키지 말 것)
> 예제 코드의 제목은 클래스명으로 하고 ###으로 시작할 것.
> 중요한 부분을 `을 사용해 강조할 것.
예시)
# 1. 새로운 할인 정책 적용
## 1.1 새로운 할인 정책 개발
- 기존 `고정 금액 할인`에서 `주문 금액에 따른 정률 할인`으로 변경함.
- `RateDiscountPolicy` 클래스를 추가함.
### 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;
}
}
}
```
### RateDiscountPolicyTest
```java
class RateDiscountPolicyTest {
RateDiscountPolicy discountPolicy = new RateDiscountPolicy();
@Test
@DisplayName("VIP는 10% 할인이 적용되어야 한다.")
void vip_o() {
// given
Member member = new Member(1L, "memberVIP", Grade.VIP);
// when
int discount = discountPolicy.discount(member, 10000);
// then
assertThat(discount).isEqualTo(1000);
}
@Test
@DisplayName("VIP가 아니면 할인이 적용되지 않아야 한다.")
void vip_x() {
// given
Member member = new Member(2L, "memberBASIC", Grade.BASIC);
// when
int discount = discountPolicy.discount(member, 10000);
// then
assertThat(discount).isEqualTo(0);
}
}
```
## 1.2 새로운 할인 정책 적용과 문제점
- 할인 정책을 변경하려면 `OrderServiceImpl`의 코드를 변경해야 함.
- `OrderServiceImpl`은 `DiscountPolicy` 인터페이스에만 의존하는 것이 아니라 `FixDiscountPolicy`, `RateDiscountPolicy`와 같은 `구체 클래스에도 의존`하고 있음.
- `DIP(의존 역전 원칙)`을 위반하고 있음.
- 기능을 확장해서 변경하면 클라이언트 코드에 영향을 주므로 `OCP(개방-폐쇄 원칙)`를 위반함.
# 2. 문제 해결 방안
## 2.1 인터페이스에만 의존하도록 변경
- `OrderServiceImpl`이 `DiscountPolicy` 인터페이스에만 의존하도록 코드를 변경함.
- 구현 객체를 생성하고 주입해줄 `AppConfig` 클래스를 생성함.
## 2.2 관심사의 분리
- `AppConfig`는 애플리케이션의 전체 동작 방식을 구성하고 구현 객체를 생성, 연결하는 책임을 가짐.
- `MemberServiceImpl`과 `OrderServiceImpl`은 `실행에만 집중함.`
### AppConfig
```java
public class AppConfig {
public ***MemberService*** memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public ***OrderService*** orderService() {
return new OrderServiceImpl(
new MemoryMemberRepository(),
new FixDiscountPolicy()
);
}
}
```
No Data configured
npx -y @modelcontextprotocol/server-filesystem /Users
npx -y @modelcontextprotocol/server-memory