반응형
01. 💖Spring Bean Configuration File
[05-5.lombok.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="<http://www.springframework.org/schema/beans>"
xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"
xmlns:context="<http://www.springframework.org/schema/context>"
xsi:schemaLocation="<http://www.springframework.org/schema/beans> <http://www.springframework.org/schema/beans/spring-beans.xsd>
<http://www.springframework.org/schema/context> <http://www.springframework.org/schema/context/spring-context.xsd>">
<bean class="xyz.itwill05.lombok.Member" id="member">
<property name="id" value="abc123"/>
<property name="name" value="홍길동"/>
<property name="email" value="abc123@itwill.xyz"/>
</bean>
<context:component-scan base-package="xyz.itwill05.lombok"/>
</beans>
02. DTO클래스
Member.java
package xyz.itwill05.lombok;
import lombok.Data;
import lombok.RequiredArgsConstructor;
//클래스의 생성자나 메소드를 자동으로 만들어주는 Lombok 라이브러리를 사용하는 방법
//1.Lombok 라이브러리를 프로젝트에 빌드 처리 - 메이븐 사용 : pom.xml
//2.이클립스를 종료하고 콘솔을 관리자 권한으로 실행한 후 Lombok 라이브러리가 저장된 로컬
//저장소(Local Repository - .m2 폴더)의 라이브러리 폴더로 이동
//3.콘솔에서 Jar 프로그램 실행하여 Lombok 라이브러리를 이클립스에 사용할 수 있도록 설정
// => Jar 프로그램 실행 방법 : java -jar lombok-1.18.26.jar
// => 탐색기에서 로컬 저장소의 라이브러리 폴더로 이동하요 Jar 파일을 더블클릭하여 실행 가능
//4.Jar 프로그램을 실행하여 제공된 창에서 Lombok를 사용할 이클립스를 선택하여 Lombok 설치
// => 이클립스를 찾을 수 없는 경우 이클립스가 설치된 디렉토리를 선택하여 설치 가능
//5.Lombok이 설치된 이클립스 폴더로 이동하여 eclipse.ini 파일 변경
// => javaagent 속성의 lombok 경로를 절대경로에서 상대경로로 변경 => -javaagent:lombok.jar
//6.이클립스를 실행하여 Lombok 라이브러리가 제공하는 어노테이션 사용
// => @Setter, @Getter, @ToString, @Data, @AllArgsConstructor, @RequiredArgsConstructor 등
//회원정보를 저장하기 위한 클래스 - VO 클래스 : 값을 저장하기 위한 목적의 객체를 생성하기 위한 클래스
//@Setter : 필드의 Setter 메소드를 자동 생성하여 제공하는 어노테이션
//@Getter : 필드의 Getter 메소드를 자동 생성하여 제공하는 어노테이션
//@ToString : 클래스의 필드값을 반환하는 toString 메소드를 자동 생성하여 제공하는 어노테이션
//@Data : Setter, Getter, toString 메소드 등을 자동 생성하는 어노테이션
@Data
public class Member {
private String id;
private String name;
private String email;
}
03. DAO클래스 - 포함(의존) : 부
(부모) MemberDAO 인터페이스
package xyz.itwill05.lombok;
import java.util.List;
public interface MemberDAO {
int insertMember(Member member);
int updateMember(Member member);
int deleteMember(String id);
Member selectMember(String id);
List<Member> selectMemberList();
}
(자식) MemberDAOImpl 클래스
package xyz.itwill05.lombok;
import java.util.List;
import org.springframework.stereotype.Repository;
@Repository
public class MemberDAOImpl implements MemberDAO {
public MemberDAOImpl() {
System.out.println("### MemberDAOImpl 클래스의 기본 생성자 호출 ###");
}
@Override
public int insertMember(Member member) {
System.out.println("*** MemberDAOImpl 클래스의 insertMember(Member member) 메소드 호출 ***");
return 0;
}
@Override
public int updateMember(Member member) {
System.out.println("*** MemberDAOImpl 클래스의 updateMember(Member member) 메소드 호출 ***");
return 0;
}
@Override
public int deleteMember(String id) {
System.out.println("*** MemberDAOImpl 클래스의 deleteMember(String id) 메소드 호출 ***");
return 0;
}
@Override
public Member selectMember(String id) {
System.out.println("*** MemberDAOImpl 클래스의 selectMember(String id) 메소드 호출 ***");
return null;
}
@Override
public List<Member> selectMemberList() {
System.out.println("*** MemberDAOImpl 클래스의 selectMemberList() 메소드 호출 ***");
return null;
}
}
04. Service클래스 - 포함(의존) : 주
(부모) MemberService 인터페이스
package xyz.itwill05.lombok;
import java.util.List;
public interface MemberService {
void addMember(Member member);
void modifyMember(Member member);
void removeMember(String id);
Member getMember(String id);
List<Member> getMemberList();
}
(자식) MemberServiceImpl 클래스
- 롬북 라이브러리 이용해 어노테이션 사용
- 의존성 자동 주입을 위해 어노테이션 사용
package xyz.itwill05.lombok;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import xyz.itwill05.di.StudentDAO;
@Service
//@AllArgsConstructor : 클래스에 작성된 모든 필드의 초기화를 위한 매개변수가 선언된 생성자를 자동으로 만들어주는 어노테이션 - Lombok 라이브러리에서 제공되는 어노테이션
// => 생성자를 이용하여 [모든 필드]에 대한 의존성 주입
//@AllArgsConstructor
//@RequiredArgsConstructor : 클래스에 작성된 필드 중 final 키워드를 사용하여 선언된 필드의 초기화를 위한 매개변수가 선언된 생성자를 자동으로 만들어주는 어노테이션 - Lombok 라이브러리에서 제공되는 어노테이션
//=> 생성자를 이용하여 [원하는 필드]에 대한 의존성 주입
@RequiredArgsConstructor
public class MemberServiceImpl implements MemberService {
//1.
//@Autowired - 필드 의존성 주입
//필드에 @Autowired 어노테이션을 선언하여 의존성 주입 - 필드 의존성 주입(필드에 직접 injection처리하다!)
//=> 필드에 대한 Setter 메소드가 없어도 필드에 의존성 주입 가능
//=> 단점: 가장 간단한 의존성 주입 방법이지만 순환 참조(a->b->c->a참조) 시 에러가 발생되지 않아 StackOverFlow(메모리과부하) 발생 가능
//@Autowired //비권장
//private MemberDAO memberDAO;
//@RequiredArgsConstructor 어노테이션으로 생성자를 이용하여 의존성 주입을 하기 위한 필드에는 [반드시 final 키워드]를 사용하여 선언
private final MemberDAO memberDAO;
private StudentDAO studentDAO; //final이 없으므로 의존성 주입이 되지 않음
//2.
//@Autowired - Setter 의존성 주입 (Setter Injection)
//Setter Injection
//필드의 Setter 메소드에 @Autowired 어노테이션을 선언하여 필드에 의존성 주입 - Setter 의존성 주입
// => 단점: Setter 메소드의 접근지정자가 [public]인 경우 다른 클래스에서 Setter 메소드가
//호출되어 의존관계 변경 가능
/*
@Autowired
public void setMemberDAO(MemberDAO memberDAO) {
System.out.println("*** MemberServiceImpl 클래스의 setMemberDAO(MemberDAO memberDAO) 메소드 호출 ***");
this.memberDAO = memberDAO;
}
*/
//3.
//@Autowired - 매개변수가 있는 Constructor에 의존성 주입 (Constructor Injection)
//매개변수가 있는 Constructor에 @Autowired하고 싶은데, 생성자가 하나만 선언된 경우 @Autowired 생략이 가능하므로 기본생성자는 주석처리
/*
public MemberServiceImpl() {
System.out.println("### MemberServiceImpl 클래스의 기본 생성자 호출 ###");
}
*/
//Contructor Injection
//필드를 초기화 시키는 매개변수가 선언된 생성자에 @Autowired 어노테이션을 선언하여
//필드에 의존성 주입 - 생성자 의존성 주입
// => Spring Framework에서는 순환 참조 방지를 위해 생성자 의존성 주입 권장
// => 생성자를 이용하여 의존성 주입할 때 생성자가 하나만 선언된 경우 @Autowired 생략 가능
//@Autowired
/*
public MemberServiceImpl(MemberDAO memberDAO) {
super();
this.memberDAO = memberDAO;
System.out.println("### MemberServiceImpl 클래스의 매개변수가 선언된 생성자 호출 ###");
}
*/
@Override
public void addMember(Member member) {
System.out.println("*** MemberServiceImpl 클래스의 addMember(Member member) 메소드 호출 ***");
memberDAO.insertMember(member);
}
@Override
public void modifyMember(Member member) {
System.out.println("*** MemberServiceImpl 클래스의 modifyMember(Member member) 메소드 호출 ***");
memberDAO.updateMember(member);
}
@Override
public void removeMember(String id) {
System.out.println("*** MemberServiceImpl 클래스의 removeMember(String id) 메소드 호출 ***");
memberDAO.deleteMember(id);
}
@Override
public Member getMember(String id) {
System.out.println("*** MemberServiceImpl 클래스의 getMember(String id) 메소드 호출 ***");
memberDAO.selectMember(id);
return null;
}
@Override
public List<Member> getMemberList() {
System.out.println("*** MemberServiceImpl 클래스의 getMemberList() 메소드 호출 ***");
memberDAO.selectMemberList();
return null;
}
}
05. 요청처리
AnnotationStudentApp.java
- MemberServiceImpl 클래스의 기본 생성자와 Lombok에 의한 MemberServiceImpl 클래스의 매개변수가 선언된 생성자가 함께 호출될 것임 - (sysout 작성을 하지 않아서 실행 시 콘솔에 출력되는 것은 없음)
package xyz.itwill05.lombok;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MemberApp {
public static void main(String[] args) {
System.out.println("================== Spring Container 초기화 전 ==================");
ApplicationContext context=new ClassPathXmlApplicationContext("05-5_lombok.xml");
System.out.println("================== Spring Container 초기화 후 ==================");
Member member=context.getBean("member",Member.class);
//참조변수를 출력할 경우 Member.toString() 메소드를 호출하여 반환값 출력
System.out.println("member = "+member);
System.out.println("================================================================");
MemberService service=context.getBean("memberServiceImpl", MemberService.class);
service.addMember(member);
service.modifyMember(member);
service.removeMember("abc123");
service.getMember("abc123");
service.getMemberList();
System.out.println("================================================================");
((ClassPathXmlApplicationContext)context).close();
}
}
반응형