본문 바로가기

전체 글

(146)
Spring- 스프링 컨테이너로 등록하기(2) package hello.core; import hello.core.member.Grade; import hello.core.member.Member; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.order.Order; import hello.core.order.OrderService; import hello.core.order.OrderServiceImpl; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigA..
Spring- 스프링 컨테이너로 등록하기(1) 스프링 컨테이너로 등록하기 @Configuration 설정 클래스를 스프링 빈으로 등록하기 위해서는 @Configuraition 어노테이션을 붙여준다. 이번에도 AppConfig 클래스를 예시로 들겠다. AppConfig 클래스(DI 컨테이너) package hello.core; @Configuration // @Configuration : 설정 정보 public class AppConfig { ..... } @Bean 사실 AppConfig는 다음과 같이 구현되어 있다. AppConfig 클래스(DI 컨테이너) 내부 모습 package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountP..
Spring- IoC, DI 컨테이너 IoC 의존관계 역전 클라이언트 클래스에서 직접 객체를 필요시 마다 생성해서 직접 관리하는 것이 아닌 외부에서 DI를 통해서 의존관계를 연결해주는 것을 연결 대상이 역전 되었다하여 의존관계 역전이라고 한다. DI 컨테이너 직전 포스팅에서 보았던 AppConfig와 같이 외부에서 의존관계 주입을 통해서 외부에서 객체를 생성하고 의존관계를 연결해주는 것을 DI 컨테이너 라고 한다. IoC 컨테이너, 어셈블러, 팩토리라고도 한다.
Spring- Dependency Injection(의존 관계 주입) DI(의존관계 주입) 코드를 짜면서 내부 로직을 변경해야 하는 경우에 OCP 원칙이 잘 지켜지지 않을 수 있다. OCP 원칙과 DIP 원칙을 준수하기 위해서 DI를 진행한다. 참고) OCP: 기존 코드를 변경하지 않는 것 DIP: 클래스가 아닌 인터페이스에 의존하는 것 package hello.core.order; import hello.core.discount.DiscountPolicy; import hello.core.member.Member; import hello.core.member.MemberRepository; public class OrderServiceImpl implements OrderService{ //인터페이스에만 의존 (DIP 원칙 준수) private final MemberRe..
Spring- 객체 지향의 SOLID 원칙 5개 원칙 - SRP : 단일 책임 원칙 한 클래스는 하나의 책임만 가져야한다. 변경시 파급효과가 적으면 단일 책임 원칙을 잘 따른 것 - OCP : 개방 폐쇄 원칙 기존 코드를 변경하지 않는 것. 다형성을 활용해 확장에는 열려있으나 변경에는 닫혀있도록한다. 다형성만 가지고는 OCP 원칙을 지킬수 없다. 객체를 생성하고 연관관계를 맺어주는 별도의 조립, 설정자가 필요 - LSP : 리스코프 치환 원칙 인터페이스의 규약이 존재한다면 하위 클래스는 무조건 그 규약을 지켜야함. 예를 들어 엑셀을 밟으면 앞으로 간다라고 했으면, 하위 클래스에선 무조건 이를 따라야한다. 엑셀 밟으면 뒤로가는 식으로 구현하면 안된다는 말. 컴파일 되고 안되고의 문제가 아닌 구현을 하는데 있어서 기존의 원칙을 위반해서는 안된다는 것..
Java- 제네릭(1) 제네릭 제네릭이란? 제네릭은 대충 봤을 때는 템플릿이랑 똑같다. 근데 완전히 똑같진 않고 살짝 차이가 있긴한데 이건 나중에 얘기하자. 제네릭 클래스의 생성 class Orange{ @Override public String toString(){ return "this is an Orange"; } } class Apple { @Override public String toString(){ return "this is an Apple"; } } class Box{ //제네릭 클래스 private T ob; Box(T ob){ this.ob = ob; } void showInfo(){ System.out.println(ob); } T get(){ return ob; } } public class FruitA..
Java- Arrays 클래스 배열의 복사 새로운 배열 생성 후 반환 - type[ ] copyOf(type[ ] original, int newLength) original에 전달된 배열을 첫번째 요소부터 newLength의 길이만큼 복사. 여러 자료형으로 오버라이딩 되어있음. - type[ ] copyOfRange(type[ ] original, int from, int to) original 배열의 인덱스 [from, to)의 내용을 가진 배열을 새로 생성해서 반환한다. 기존 배열에 내용 복사 - void arrayCopy(Object src, int srcPos, Object dest, int destPos, int length) 배열 src의 srcPos 에서 배열 dest의 destPos로 length 만큼 복사. 배열의 ..
Java- Random 클래스, 난수 생성 Random 클래스 간단하니 대충 설명한다. Random 인스턴스는 난수를 생성시 사용하며 생성자의 인자로는 시드값이 들어간다. 시드를 안 넣는다면 1970년 1월 1일 부터 지금까지 지난 밀리초 단위의 시간이 시드값으로 들어가서 난수를 생성한다. import java.util.Random; /* Random(){ this(System.currentTimeMillis()); //Random(long seed)의 디폴트 생성자 } */ public class RandomNumberGenerator { public static void main(String[] args) { Random rand = new Random(); // 인자로 seed 전달. // 인자가 없을 시 seed로 System.curren..