상세 컨텐츠

본문 제목

[스프링 1팀] 스프링 입문 섹션 5~6

24-25/Spring 1

by oze 2024. 10. 11. 10:00

본문

728x90

스프링 빈과 의존관계

스프링 빈(Bean)

 

📌 스프링 빈(Bean) 이란?

스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트

즉, 인스턴스화된 객체이며 스프링 컨테이너에 등록된 객체임(new 키워드 대신 사용)

 

📌 스프링 빈(Bean) 사용 목적

스프링 간 객체의 의존관계를 관리하기 위하여 사용

객체가 의존관계를 등록할 때, 스프링 컨테이너에서 해당하는 빈을 찾고 그 빈과 의존성을 형성함

 

스프링 빈을 등록하는 2가지 방법

  1. 컴포넌트 스캔과 자동 의존관계 설정
  2. 자바 코드로 직접 스프링 빈 등록하기

 

컴포넌트 스캔과 자동 의존관계 설정

 

회원 컨트롤러에 의존관계 추가

package hello.hellospring.controller;

import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class MemberController {

	private final MemberService memberService;
 
	@Autowired
	public MemberController(MemberService memberService) {
		this.memberService = memberService;
	}
 
}

 

📌 @Autowired

생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어줌

=> 객체 의존관계를 외부에서 넣어주는 것을 DI(의존성 주입)이라고 함

 

*오류: memberService가 스프링빈으로 등록되어있지 않음(컨트롤러는 자동 등록됨)

 

 

컴포넌트 스캔 원리

📌컴포넌트 스캔: 스프링 빈을 자동으로 등록하는 기능 

  • @Component 애노테이션 사용
    • @Controller (앞서 MemberController가 스프링 빈으로 자동 등록된 이유)
    • @Service
    • @Repository

 

회원 서비스 스프링 빈 등록

@Service
public class MemberService {

	private final MemberRepository memberRepository;

	@Autowired
	public MemberService(MemberRepository memberRepository) {
		this.memberRepository = memberRepository;
 	}
    
}

 

 

회원 리포지토리 스프링 빈 등록

@Repository
public class MemoryMemberRepository implements MemberRepository {}

 

※ 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록함

   (📌싱글톤: 유일하게 하나만 등록해서 공유)

 

 

자바 코드로 직접 스프링 빈 등록하기

회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 애노테이션 제거 후 진행

 

📌@Configuration: 스프링 컨테이너에게 해당 클래스가 Bean 구성 클래스임을 알려줌

     (@Bean을 이용하여 스프링 빈 생성)

package hello.hellospring;

import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {

	@Bean
	public MemberService memberService() {
		return new MemberService(memberRepository());
 	}

	@Bean
 	public MemberRepository memberRepository() {
		return new MemoryMemberRepository();
	}

}

 

 


 

회원 관리 예제 - 웹 MVC 개발

회원 웹 기능 - 홈 화면 추가

 

홈 컨트롤러 추가

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {
	
    @GetMapping("/")
    public String home() {
	return "home";
    }
    
}

 

 

회원 관리용 홈

resources/templates/home.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
 <div>
 <h1>Hello Spring</h1>
 <p>회원 기능</p>
 <p>
 <a href="/members/new">회원 가입</a>
 <a href="/members">회원 목록</a>
 </p>
 </div>
</div> <!-- /container -->
</body>
</html>

 

 

회원 웹 기능 - 등록

 

회원 등록 폼 개발

  • 회원 등록 폼 컨트롤러
@Controller
public class MemberController {

	private final MemberService memberService;
    
        @Autowired
	public MemberController(MemberService memberService) {
		this.memberService = memberService;
	}
	
	@GetMapping(value = "/members/new")
	public String createForm() {
		return "members/createMemberForm";
	}
  
}

 

  • 회원 등록 폼 HTML

resources/templates/members/createMemberForm.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
 <form action="/members/new" method="post">
 <div class="form-group">
 <label for="name">이름</label>
 <input type="text" id="name" name="name" placeholder="이름을 입력하세요">
 </div>
 <button type="submit">등록</button>
 </form>
</div> <!-- /container -->
</body>
</html>

 

 

회원 등록 컨트롤러

  • 웹 등록 화면에서 데이터를 전달 받을 폼 객체 (Getter, Setter 생성) 
package hello.hellospring.controller;

public class MemberForm {
	private String name;
    
	public String getName() {
	  	return name;
	}

	public void setName(String name) {
		this.name = name;
	}
    
}

 

  • 회원 컨트롤러에서 회원을 실제 등록하는 기능

MemberController.java에 추가

@PostMapping(value = "/members/new")
public String create(MemberForm form) {

	Member member = new Member();
	member.setName(form.getName());
	
	memberService.join(member);
	
	return "redirect:/";
}

 

 

회원 웹 기능 - 조회

 

회원 컨트롤러에서 조회 기능

 

MemberController.java에 추가

@GetMapping(value = "/members")
public String list(Model model) {

	List<Member> members = memberService.findMembers();
	model.addAttribute("members", members);
	return "members/memberList";

}

 

 

회원 리스트 HTML

resources/templates/members/memberList.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
 <div>
 <table>
 <thead>
 <tr>
 <th>#</th>
 <th>이름</th>
 </tr>
 </thead>
 <tbody>
 <tr th:each="member : ${members}">
 <td th:text="${member.id}"></td>
 <td th:text="${member.name}"></td>
 </tr>
 </tbody>
 </table>
 </div>
</div> <!-- /container -->
</body>
</html>

 

 

 


Quiz

1. 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트를 ( 스프링 빈 ) (이)라고 한다.

2. 생성자에  ( @Autowired )  애노테이션이 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.

3. ( @Component ) 애노테이션이 있으면 스프링 빈으로 자동 등록된다. 

4. @Component 를 포함하는 애노테이션에는 ( @Controller @Service ,  @Repository  ) 가 있다.  

5. 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 ( 싱글톤 )  (으)로 등록한다

6. 스프링 컨테이너에게 해당 클래스가 Bean 구성 클래스임을 알려주는 애노테이션은  ( @Configuration ) 이다.

7. 자바 코드로 직접 스크린 빈을 생성할 때는 (  @Bean  ) 애노테이션을 이용한다.

 

Programming Quiz

1. 회원 서비스 스프링 빈을 등록하는 다음 코드를 완성하시오. 

// 1) (한줄)
public class MemberService {

	private final MemberRepository memberRepository;

	/* 2) 
    
    
	*/
    
}

 

 

2. 자바 코드로 직접 스프링 빈을 등록하는 코드를 완성하시오.

// 1) (한줄)
public class SpringConfig {

	/* 2) 회원 서비스
    
    
 	*/

	/* 3) 회원 리포지토리
    
    
	*/ 

}

 

 

 


Answer

1.

@Service  // 1)
public class MemberService {

	private final MemberRepository memberRepository;

	// 2)
	@Autowired 
	public MemberService(MemberRepository memberRepository) {
		this.memberRepository = memberRepository;
 	}
    
}

 

 

2. 

@Configuration // 1)
public class SpringConfig {

	// 2)
	@Bean
	public MemberService memberService() {
		return new MemberService(memberRepository());
 	}

	// 3)
	@Bean
 	public MemberRepository memberRepository() {
		return new MemoryMemberRepository();
	}

}

출처:  스프링 입문, 코드로 배우는 스프링 부트, 웹MVC, DB접근기술 강의

Corner Spring 1
Editor:  Via

728x90

관련글 더보기