본문 바로가기

Spring 프레임워크/예제7

"비즈니스 레이어 (서비스 레이어) 를 사용 하기" 예제 1. 서버에서 DBMS (DataBase Management System) 변경이 자주 발생 한다. 즉, DAO 변경이 자주 발생 하게 된다는 의미 이다. DAO 이란 ? Data Access Object 을 의미하며, 데이터베이스나 다른 영구한 저장소에 접근하여 데이터를 조작하는 역할을 담당 한다. 데이터베이스와의 상호작용 즉, CRUD 작업을 처리 한다. 암튼 이렇게 변경이 자주 발생 하는 DAO 를 직접 사용 하면, 결합도가 높아져서 코드의 유지 보수에 불리해짐을 의미 한다. >> 무언가 객체를 직업 사용 한다 == 결합도 증가 == 유지 보수 불리 2. Service 를 통해 DAO를 간접 사용 하여 결합도 낮추기 (== 유지 보수 용이) XxxController.java 내부의 메서드 에서 사용.. 2023. 8. 8.
예제 06 의존 주입 (Setter Injection) 1. TV 인터페이스 2. RemoteControl 인터페이스 3. 각 인터페이스를 구현한 클래스 4. TV 인터페이스를 구현한 LgTV 클래스는, RemoteControl 인터페이스의 참조변수 remoteControl를 멤버 (변수) 로 두고 있다. 즉, 둘은 의존 관계 이며, 의존 주입을 setter 을 통해 주입 시키기 위해, setter 메서드를 작성 했다. 5. applicationContext.xml 의 코드를 확인 할 수 있다. setter로 의존주입을 하기 위해서는, .xml 파일 내부에서, 태그를 사용한것이 과의 차이점 이다. 위의 name 속성의 값이 setter 메서드의 이름과 동일 해야 한다. 예를들어, setter 메서드의 메서드명이, setHwan 이면, 이어야 한다는 말이다. .. 2023. 8. 1.
예제 05 의존 주입 (Contructor Injection) 1. TV 인터페이스 RemoteControl 인터페이스 2. 각각의 인터페이스들을 구현한 SamsungTV, LgTV, SamsungRC, LgRC 클래스 3. applicationContext.xml 1) lazy-init = "true" 를 하면, LookUp 했을 때만, 스프링 컨테이너가 해당 자료형의 객체를 인스턴스화 해준다. lazy-init은 디폴트 값이 "false" 이다. 그래서, lazy-init = "true" 명시 해놓지 않으면, 스프링 컨테이너가 시작될 때, 해당 자료형의 객체를 즉각 인스턴스화 해준다. [ 참고 ] lazy-init = "true" 속성이 설정되어 있으면, 해당 객체는 스프링 컨테이너에서 처음으로 사용되는 시점에 초기화 된다. 즉, getBean() 메서드가 호출.. 2023. 8. 1.
예제 04 (.xml 파일 기타 개념) .xml 파일 내부 코드가 위와 같이 작성 되어 있다. 객체가 어떤 순서대로 생성될까 ? 알아보기 위해 각 클래스 내부에 log를 찍어 보았다. 돌려보면, Console 결과창은 아래와 같이 나오게 된다. 위에서, 분명 갤럭시워치는 갤럭시폰 아래에 객체 생성 코드를 작성했었는데, 제일 먼저 갤럭시워치가 객체화 되는 로그를 확인 할 수 있다. 갤럭시폰의 인자 2개짜리 생성자를 호출 해야 하는 상황이라, .xml 파일이 똑똑하게 알아서, 갤럭시워치를 먼저 객체화 해준것을 확인 할 수 있다. 그외 참고 init-method destroy-method lazy-init 얘는 다시 정리 하기. 2023. 7. 31.
예제 03 ( .xml 파일을 사용하여 객체를 생성 하기 ) Phone 인터페이스를 구현한 GalaxyPhone 클래스에 갤럭시워치 타입의 갤럭시워치를 멤버변수로 추가 해보자. 그리고, 갤럭시폰의 볼륨 조절은 갤럭시워치를 통해서 할 수 있는 설계로 가정해보자. 갤럭시워치 클래스 내부는 아래와 같다. 그러면, 아래와 같이 작성 하게 된다. 그런데, 이것을 컴파일 하게 되면, NPE가 발생 하게 된다. 당연하게도, 저 두 아이를 객체화 해주지 않았기 때문이다. 주체가 galaxyWatch 이고, 주체로 메서드를 호출 하기 때문에, 인스턴스 메서드 이며, 주체를 new 키워드로 인스턴스화 하지 않았기에, null로 메서드를 호출하니, 발생하는 NPE 에러인 것이다. 따라서, 위와 같이 코드를 삽입해주면, 이렇게 해결이 되는 모습을 확인 할 수 있다. 하지만, new 키.. 2023. 7. 31.
예제 02 [ Factory 패턴 ] (BeanFactory) 예제 01에서, "new 키워드를 거의 사용 하지 않는 방법은 없을까 ?" 에 대해 알아보았다. 바로, Factory 패턴 이다. Factory 패턴 이란 ? 객체를 생성하는 코드를 캡슐화 한다. == new 키워드와 관련된 코드를 은닉 (Hiding) 사용자로부터 필요한 객체의 이름을 받아, 객체 자체를 반환하는 로직을 의미 한다. 코드를 단 한글자도 변경 하지 않아도, 결과가 (화면) 달라진다 ! 아래와 같이 Factory 클래스를 생성 한다. getBean 메서드의 시그니쳐를 보면, output으로 Object 타입인 것을 확인 할 수 있다. 모든 타입의 객체를 다 반환 하겠다는 의미 이다. 이렇게 어쩌구Factory 클래스를 생성 하면, Client.java 클래스의 코드는 아래와 같이 작성 할 .. 2023. 7. 31.
예제 01 (new 키워드의 높은 결합도) 아래와 같이, 갤럭시폰 클래스가 있다고 가정 해보자. 또한, 아이폰 클래스가 있다고 해보자. 사용자가 만약에, 갤럭시폰을 사고 싶거나 이용하려면 어떻게 해야할까 ? 위와 같이, new 키워드를 사용하여, 객체화를 하고, galaxyPhone 이라는 참조변수를 통해, 원하는 기능을 수행하는 메서드를 호출 하면 된다. 근데 ! 만약에, 사용자가 아이폰도 구매해서 사용 하고 싶으면 어떻게 해야할까 ? 위와 같이, 데이터 타입을 (클래스명) IPhone 으로 변경 하면 가능할까 ? 당연히 아니다. new 키워드 뒤의 코드도 변경해 줘야 한다. (객체화를 할 때, (디폴트) 생성자를 호출 ~) 그래서 아래와 같이, new 키워드 뒤의 코드도 변경해 주었다. 이제 아이폰을 구매 해서 사용 할 수 있을까 ? 구매는 .. 2023. 7. 31.