상세 컨텐츠

본문 제목

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

24-25/Spring 3

by Igumi 2024. 10. 11. 10:00

본문

728x90

 


스프링 빈과 의존관계

 

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

 

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

// controller/MemberController.java

@Controller
public class MemberController {

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

 

 @Autowired 어노테이션: 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어줌

 DI (Dependency Injection): 의존성 주입. 객체 의존관계를 외부에서 넣어주는 것을 뜻함

  @Controller 어노테이션: 스프링 빈으로 자동 등록됨 (@Component 어노테이션을 포함)

 

 

📍  회원 서비스 스프링 빈 등록

// service/MemberService.java

@Service
public class MemberService {
	 private final MemberRepository memberRepository;
     
	 @Autowired
	 public MemberService(MemberRepository memberRepository) {
		 this.memberRepository = memberRepository;
	 }
}

 

 @Service 어노테이션: 스프링 빈으로 자동 등록됨 (@Component 어노테이션을 포함)

 

 

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

// repository/MemoryMemberRepository.java

@Repository
public class MemoryMemberRepository implements MemberRepository {}

 

 @Repository 어노테이션: 스프링 빈으로 자동 등록됨 (@Component 어노테이션을 포함)

 

 

스프링 빈 등록 이미지

  • memberService 와 memberRepository 가 스프링 컨테이너에 스프링 빈으로 등록되어 있음
  • 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본적으로 싱글톤으로 등록함

 

 

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

 

📍  @Service, @Repository, @Autowired 애노테이션을 제거하고 직접 스프링 빈 등록

// hellospring/SpringConfig.java

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

 

 @Bean어노테이션: 스프링 빈으로 등록함

 

 

회원 웹 기능 - 홈 화면 추가

 

📍  홈 컨트롤러 추가

// controller/HomeController.java

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";
 	}
}

 

 컨트롤러가 정적 파일보다 우선순위가 높으므로, index.html이 아닌 home.html에 접근

 

 

회원 웹 기능 - 등록

 

회원 등록 폼 개발

 

📍  회원 등록 폼 컨트롤러

// controller/MemberController.java

@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 )

<!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>

 

 input 태그의 name 속성과 MemberForm의 name 필드가 연결됨

 

 

회원 등록 폼 개발

 

📍  웹 등록 화면에서 데이터를 전달 받을 폼 객체

// controller/MemberForm.java

package hello.hellospring.controller;
public class MemberForm {

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

 

 name 속성 값이 'name'인 input 태그와 연결됨 (createMemberForm.html의 input 태그)

 

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

// controller/MemberController.java

@PostMapping(value = "/members/new")
public String create(MemberForm form) {
 	Member member = new Member();
 	member.setName(form.getName());
    
 	memberService.join(member);
    
 	return "redirect:/";
}

 

 createMemberForm.html의 input 태그에서 받은 name값으로 회원 등록 진행

 home(localhost:8080/)으로 리다이렉트

 

 

회원 웹 기능 - 조회

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

// controller/MemberController.java

@GetMapping(value = "/members")
public String list(Model model) {
 	List<Member> members = memberService.findMembers();
 	model.addAttribute("members", members);
 	return "members/memberList";
}

 

 model에 'members' attribute를 추가하고 모든 멤버 리스트를 저장

 

 

📍 회원 리스트 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>

 

 model에서 key가 members인 attribute를 가져와 each문을 수행함

 member.id와 member.name은 getter를 호출함

 

 

 

 

 


Blank Quiz

 

  1. 생성자에 ____________ 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.
  2. 자바 클래스에 ____________ 애노테이션이 있으면 스프링 빈으로 자동 등록된다.
  3. 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 ____________ 으로 등록한다. (유일하게 하나만 등록해서 공유한다.)
  4. 자바 코드로 직접 스프링 빈 등록할 때에는 Config 클래스를 만들고 ____________ 애노테이션을 사용한다.
  5. 직접 스프링 빈으로 등록할 때에는 스프링 빈으로 등록할 클래스 앞에 ____________ 애노테이션을 사용한다.
  6. 컨트롤러가 정적 파일보다 우선순위가 ____________ (높다/낮다).
  7.  home(localhost:8080/)으로 리다이렉트할 때에는 return " ____________ ";를 사용한다.

 

 

Programming Quiz

 

1. 생성자 주입 방식으로 memberService 의존관계를 설정하시오.

@Controller
public class MemberController {

 	private final MemberService memberService;
    
 	// 채워넣기
}

 

 

2. 직접 memberRepository를 스프링 빈으로 등록하시오.

@Configuration
public class SpringConfig {

 	@Bean
 	public MemberService memberService() {
 		return new MemberService(memberRepository());
 	}
    
 	// 채워넣기
 }

 

 

 


<퀴즈 답안>

더보기

Blank Quiz

  • @Autowired, @Component, 싱글톤, @Configuration, @Bean, 높다, redirect:/

 

Programming Quiz

1.

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

 

2.

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

 

 

 

 

[출처] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

(섹션 5 회원 관리 예제 - 웹 MVC 개발)

 

Corner Spring 3

ⓒ Pumpkin

728x90

관련글 더보기