Spring & Springboot/올인원 스프링 프레임워크

빈 객체 구현

YJ_ma 2023. 9. 22. 22:44

Service 빈 객체 구현

· 사용자의 요청으로 컨트롤러의 signUpConfirm() 이 실행되면, 그 다음은 컨트롤러에서 서비스 객체를 이용한다.

· 서비스 객체를 이용한다 == 서비스 객체의 메서드를 호출한다.

· 서비스 객체를 생성하고 이용하는 방법에 대해 알아본다.

 

▶ 서비스 객체 생성과 이용방법

① 객체 생성 연산자(new)를 이용해서 서비스 객체를 생성하고 이용한다.

② 스프링 설정 파일을 이용해서 스프링 컨테이너에 빈(Bean) 객체로 생성하고, 의존 객체 자동 주입 방법을 이용해서 서비스 객체를 이용한다.

③ 서비스 클래스에 애너테이션을 명시해서 스프링 컨테이너에 빈 객체를 생성하고, 의존 객체 자동 주입 방법을 이용해서 서비스 객체를 이용한다. (가장 많이 사용)

 

MemberService 클래스 만들기

1. com.company.hello.member 패키지에 MemberService 클래스를 생성한다. 

· MemberService에 다음과 같이 SignUpConfirm()을 선언한다.

package com.company.hello.member;

public class MemberService {

	public int signUpConfirm(MemberVo memberVo) {
		System.out.println("[MemberService] signUpConfirm()");

		return 0;
	}
}

 

new를 이용한 서비스 객체 생성 및 이용

· 자바에서 객체를 생성하고 이용하는 방법

· new연산자를 이용해서 서비스 객체를 생성하고 이용한다.

· 컨트롤러(MemberController)에 서비스(MemberService) 객체를 생성하는 코드를 추가해준다.

@Controller
public class MemberController {
	
	MemberService memberService = new MemberService();

· MemberController의 signUpConfirm()에서 MemberService의 signUpConfirm()을 호출하는 코드를 추가해준다.

@RequestMapping("/signUpConfirm")
public String signUpConfirm(MemberVo memberVo) {
    System.out.println("[MemberController] signUpConfirm()");

    System.out.println("m_id: " + memberVo.getM_id());
    System.out.println("m_pw: " + memberVo.getM_pw());
    System.out.println("m_mail: " + memberVo.getM_mail());
    System.out.println("m_phone: " + memberVo.getM_phone());

    memberService.signUpConfirm(memberVo);

    return null;
}

프로젝트를 실행하고 콘솔창을 확인하면 MemberService의 signUpConfirm()이 정상적으로 호출되는 것을 확인할 수 있다.

회원가입을 위해 사용자가 입력한 데이터가 MemberService.java에 정상적으로 전달되는지 확인해본다.

package com.company.hello.member;

public class MemberService {

	public int signUpConfirm(MemberVo memberVo) {
		System.out.println("[MemberService] signUpConfirm()");
		
		System.out.println("m_id: " + memberVo.getM_id());
		System.out.println("m_pw: " + memberVo.getM_pw());
		System.out.println("m_mail: " + memberVo.getM_mail());
		System.out.println("m_phone: " + memberVo.getM_phone());
		
		return 0;
	}
}

 

빈 객체 생성 및 의존 객체 자동 주입

▶ 작업 순서

① 스프링 설정 파일에 빈 객체를 생성한느 코드를 삽입한다.

② 실제 사용하려는 객체에는 의존 객체를 자동 주입한다.

 

1. 스프링 설정 파일(servlet-context.xml)에 다음 코드를 추가한다.

· 파일 위치 : ch08_pjt_01\src\main\webapp\WEB-INF\spring\appServlet\servlet-context.xml

<!-- MemberService 빈 생성 -->
<beans:bean id="memberService" class="com.company.hello.member.MemberService" />

스프링 설정 파일을 이용해서 MemberService 빈 객체를 스프링 IoC 컨테이너에 생성했으므로 MemberService를 사용하는 곳에서는 별도로 객체를 생성하지 않고도 의존 객체 자동 주입(@Autowired)을 이용해서 IoC 컨테이너에 생성된 빈 객체를 이용할 수 있다.

 

2. MemberController에서 의존 객체 자동 주입 방법으로 바꾸고 실행해본다.

 

애너테이션을 이용한 서비스 빈 객체 생성

· @Service 애너테이션을 사용하면 스프링 설정 파일에 별도로 빈 객체 생성 코드를 추가하지 않아도 된다.

·  @Service 애너테이션이 빈 객체를 스프링 IoC 컨테이너에 생성한다.

· 이전에 스프링 설정 파일(servet-context.xml)에 추가한 service 빈 객체 설정 코드를 주석처리해준다.

<!-- MemberService 빈 생성 -->
<!-- <beans:bean id="memberService" class="com.company.hello.member.MemberService" /> -->

· MemberService 클래스의 org.springframework.stereotype에 있는 @Service 애너테이션을 추가해준다.

· @Service를 이용해서 스프링 IoC 컨테이너에 생성된 MemberService 빈 객체는 @Autowired에 의해서 MemberController의 멤버 필드(memberService)에 자동 주입된다.

package com.company.hello.member;

import org.springframework.stereotype.Service;

@Service
public class MemberService {

 

DAO 빈 객체 구현

com.company.hello.member 패키지 > MemberDao 클래스를 생성하고 다음과 같이 입력한다.

package com.company.hello.member;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Component;

@Component
public class MemberDao {
	private Map<String, MemberVo> memberDB = new HashMap<String, MemberVo>();

	public void insertMember(MemberVo memberVo) {
		System.out.println("[MemberDao] insertMember()");

		System.out.println("m_id: " + memberVo.getM_id());
		System.out.println("m_pw: " + memberVo.getM_pw());
		System.out.println("m_mail: " + memberVo.getM_mail());
		System.out.println("m_phone: " + memberVo.getM_phone());

	}
}

⚠️ 스프링 컨테이너에 빈 객체를 생성하는 애너테이션

서비스는 @Service를 사용

DAO는 @Component를 사용

→ 둘 다 상관없이 사용 가능

 

· DAO는 서비스에서 데이터베이스 작업이 필요한 경우 호출하면 되므로, 서비스 객체에 멤버 필드로 선언하고 @Autowired를 이용해서 의존 객체를 자동 주입하면 된다.

· 따라서 MemberService에 다음 코드를 추가한다.

package com.company.hello.member;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MemberService {

	@Autowired
	MemberDao memberDao;	// 의존 객체(MemberDao) 자동 주입
	
	public int signUpConfirm(MemberVo memberVo) {
		System.out.println("[MemberService] signUpConfirm()");
		
		System.out.println("m_id: " + memberVo.getM_id());
		System.out.println("m_pw: " + memberVo.getM_pw());
		System.out.println("m_mail: " + memberVo.getM_mail());
		System.out.println("m_phone: " + memberVo.getM_phone());
		
		return 0;
	}
}

 

· MemberService는 MemberDao에 의존한다.

· MemberDao는 데이터를 관리하는 객체로 일반덕으로 데이터를 가지고 있는 VO 객체를 이용한다.

· MemberService의 siginUpConfirm()에서 MemberDao의 insertMember()를 호출할 때 memberVo를 매개변수로 전달하고 제대로 데이터가 전달되었는지 확인해본다.

package com.company.hello.member;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MemberService {

	@Autowired
	MemberDao memberDao;	// 의존 객체(MemberDao) 자동 주입
	
	public int signUpConfirm(MemberVo memberVo) {
		System.out.println("[MemberService] signUpConfirm()");
		
		System.out.println("m_id: " + memberVo.getM_id());
		System.out.println("m_pw: " + memberVo.getM_pw());
		System.out.println("m_mail: " + memberVo.getM_mail());
		System.out.println("m_phone: " + memberVo.getM_phone());
		
		memberDao.insertMember(memberVo); // memberVo를 매개변수로 전달함
		return 0;
	}
}

· MemberDao에서 Map에 전달받은 사용자 정보를 추가(put)해준다.

· memberDB의 key : memberVo의 m_id

· memberDB의 valuememberVo

· 회원 조회 시 m_id를 가지고 회원의 모든 정보(memberVo)를 조회할 수 있다.

· MemberDao 클래스에 모든 회원정보를 출력하는 printAllMember함수를 생성한다.

private void printAllMember() {
    System.out.println("[MemberDao] printAllMember()");

    Set<String> keys = memberDB.keySet();
    Iterator<String> iterator = keys.iterator();

    while (iterator.hasNext()) {
        String key = iterator.next();
        MemberVo memberVo = memberDB.get(key);

        System.out.println("m_id: " + memberVo.getM_id());
        System.out.println("m_pw: " + memberVo.getM_pw());
        System.out.println("m_mail: " + memberVo.getM_mail());
        System.out.println("m_phone: " + memberVo.getM_phone());
    }
}

insertMember 함수에서 printAllMember 함수를 추가하여 정상적으로 작동하는지 확인해본다.