Lombok lib (클래스의 생성자나 메소드 자동 생성)

woom·2023년 2월 15일
0

Framework

목록 보기
9/20
post-thumbnail

🌼 Lombok lib

  • 클래스의 생성자나 메소드를 자동으로 생성

📌 Lombok lib를 사용 방법

  1. Lombok 라이브러리를 프로젝트에 빌드 처리

  • 가장 최신 버전의 Project Lombok에서 dependency 엘리먼트 복사하여 pom.xml파일에 붙여넣기 (메이븐 사용하여 빌드 처리)

💡 pom.xml


		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<!-- => 클래스에 생성자 또는 메소드를 자동으로 생성하는 기능을 제공하는 라이브러리 -->
		<dependency>
		    <groupId>org.projectlombok</groupId>
		    <artifactId>lombok</artifactId>
		    <version>1.18.26</version>
		    <scope>provided</scope>
		</dependency>
  • Maven Dependencies에서 빌드처리 확인

  1. 이클립스를 종료하고 콘솔을 관리자 권한으로 실행한 후 Lombok 라이브러리가 저장된 로컬저장소(Local Repository - .m2 폴더)의 라이브러리 폴더로 이동

  1. 콘솔에서 Jar 프로그램 실행하여 Lombok 라이브러리를 이클립스에 사용할 수 있도록 설정
    • 콘솔에 cd 파일경로 작성 (cd : change directory로 파일 경로 작성시 사용)
    • Jar 프로그램 실행 방법 : java -jar lombok-1.18.26.jar (jar 프로그램 실행되면 작성)
    • 탐색기에서 로컬 저장소의 라이브러리 폴더로 이동하여 Jar 파일을 더블클릭해도 실행 가능
  1. Jar 프로그램을 실행하여 제공된 창에서 Lombok를 사용할 이클립스(eclipse.exe)를 선택하여 Lombok 설치

    • special location : select로 eclipse.exe 설정 후 install → eclipse exe폴더 찾아서 install
    • 이클립스를 찾을 수 없는 경우 이클립스가 설치된 디렉토리를 선택하여 설치 가능

  1. 이클립스를 실행하여 Lombok 라이브러리가 제공하는 어노테이션 사용

    • @Setter, @Getter, @ToString, @Data, @AllArgsConstructor, @RequiredArgsConstructor 등
  2. 이클립스가 실행되지 않는 경우 Lombok이 설치된 이클립스 폴더로 이동하여 eclipse.ini 파일 변경

  • javaagent 속성의 lombok 경로를 절대경로에서 상대경로로 변경 → -javaagent:lombok.jar


🐣 VO 클래스 (lombok 사용)

  • Lombok 라이브러리가 제공하는 어노테이션 사용

    • @Setter, @Getter, @ToString, @Data, @AllArgsConstructor, @RequiredArgsConstructor 등
  • 회원정보를 저장하기 위한 클래스 (VO 클래스 : 값을 저장하기 위한 목적의 객체를 생성하기 위한 클래스)

  • @Setter : 필드의 Setter 메소드를 자동 생성하여 제공하는 어노테이션

  • @Getter : 필드의 Getter 메소드를 자동 생성하여 제공하는 어노테이션

  • @ToString : 클래스의 필드값을 반환하는 toString 메소드를 자동 생성하여 제공하는 어노테이션

  • @Data : Setter, Getter, toString 메소드 등을 자동 생성하는 어노테이션


package xyz.itwill05.lombok;

import lombok.Data;

@Data
public class Member {
	private String id;
	private String name;
	private String email;
}





📕 환경설정파일 (lombok)


<?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="abc@itwill.xyz"/>
	</bean>
	
	<context:component-scan base-package="xyz.itwill05.lombok"/>
</beans>





📌 XSD (context 엘리먼트)

  • XSD : XML 스키마 정의(XML Schema Definition)

    • XSD는 XML 문서의 구조 및 해당 문서가 포함할 수 있는 적법한 요소와 속성을 명시
    • 즉, 해당 XML 문서가 유효한(valid) XML 문서로써 포함할 수 있는 관계를 정의
  • annotation을 사용하기 위해서는 환경설정 파일 생성시 context XSD가 사용됨


🌸 interface (DAO)

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();
}




📙 DAO클래스 (interface 상속)


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 클래스의 Member seleteMember(String id) 메소드 호출 ***");
		return null;
	}

	@Override
	public List<Member> selectMemberList() {
		System.out.println("*** MemberDAOImpl 클래스의 seleteMemberList() 메소드 호출 ***");
		return null;
	}

}





🌸 interface (Service)

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();
}





📒 Service 클래스 (interface 상속)

  • @AllArgsConstructor : 클래스에 작성된 모든 필드의 초기화를 위한 매개변수가 선언된 생성자를 자동으로 만들어주는 어노테이션

    • Lombok 라이브러리에서 제공되는 어노테이션
    • 생성자를 이용하여 모든 필드에 대한 의존성 주입
  • @RequiredArgsConstructor : 클래스에 작성된 필드 중 final 키워드를 사용하여 선언된 필드의 초기화를 위한 매개변수가 선언된 생성자를 자동으로 만들어주는 어노테이션

    • Lombok 라이브러리에서 제공되는 어노테이션
    • 생성자를 이용하여 원하는 필드에 대한 의존성 주입
    • @RequiredArgsConstructor 어노테이션으로 생성자를 이용하여 의존성 주입을 하기 위한 필드에는 반드시 final 키워드를 사용하여 선언
    • private final MemberDAO memberDAO;
  • @Autowired 의존성 주입
  1. 필드에 @Autowired 어노테이션을 선언하여 의존성 주입 (필드 의존성 주입)

    • 필드에 대한 Setter 메소드가 없어도 필드에 의존성 주입 가능
    • 가장 간단한 의존성 주입 방법이지만 순환 참조시 에러가 발생되지 않아 StackOverFlow 발생 가능
  2. 필드의 Setter 메소드에 @Autowired 어노테이션을 선언하여 필드에 의존성 주입 (Setter 의존성 주입)

    • Setter 메소드의 접근지정자가 [public]인 경우 다른 클래스에서 Setter 메소드가 호출되어 의존관계 변경 가능
  3. 필드를 초기화 시키는 매개변수가 선언된 생성자에 @Autowired 어노테이션을 선언하여 필드에 의존성 주입 (생성자 의존성 주입)

    • Spring Framework에서는 순환 참조 방지를 위해 생성자 의존성 주입 권장
    • 생성자를 이용하여 의존성 주입할 때 생성자가 하나만 선언된 경우 @Autowired 생략 가능


package xyz.itwill05.lombok;

import java.util.List;

import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;

@Service
//@AllArgsConstructor

//@RequiredArgsConstructor : 클래스에 작성된 필드 중 final 키워드를 사용하여 선언된 필드의 
//초기화를 위한 매개변수가 선언된 생성자를 자동으로 만들어주는 어노테이션 - Lombok 라이브러리에서 제공되는 어노테이션
// => 생성자를 이용하여 원하는 필드에 대한 의존성 주입
@RequiredArgsConstructor
public class MemberServiceImpl implements MemberService {
	//필드에 @Autowired 어노테이션을 선언하여 의존성 주입 - 필드 의존성 주입
	// => 필드에 대한 Setter 메소드가 없어도 필드에 의존성 주입 가능
	// => 가장 간단한 의존성 주입 방법이지만 순환 참조시 에러가 발생되지 않아 StackOverFlow 발생 가능
	//@Autowired
	//private MemberDAO memberDAO;
	
	//@RequiredArgsConstructor 어노테이션으로 생성자를 이용하여 의존성 주입을 하기 위한 필드에는
	//반드시 final 키워드를 사용하여 선언
	private final MemberDAO memberDAO;
	
	//필드의 Setter 메소드에 @Autowired 어노테이션을 선언하여 필드에 의존성 주입 - Setter 의존성 주입
	// => Setter 메소드의 접근지정자가 [public]인 경우 다른 클래스에서 Setter 메소드가 
	//호출되어 의존관계 변경 가능
	/*
	@Autowired
	public void setMemberDAO(MemberDAO memberDAO) {
		System.out.println("*** MemberServiceImpl 클래스의 setMemberDAO(MemberDAO memberDAO) 메소드 호출 ***");
		this.memberDAO = memberDAO;
	}
	*/
	
	/*
	public MemberServiceImpl() {
		System.out.println("### MemberServiceImpl 클래스의 기본 생성자 호출 ###");
	}
	*/

	//필드를 초기화 시키는 매개변수가 선언된 생성자에 @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) 메소드 호출 ***");
		return memberDAO.selectMember(id);
	}

	@Override
	public List<Member> getMemberList() {
		System.out.println("*** MemberServiceImpl 클래스의 getMemberList() 메소드 호출 ***");
		return memberDAO.selectMemberList();
	}
}





🐣 앱 실행

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();			
	}
}





profile
Study Log 📂

0개의 댓글