본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2025 겨울방학 스프링 스터디] 김재승 #3주차

반응형

목차

 


#섹션5

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

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

1. 컴포넌트 스캔이란?

컴포넌트 스캔은 스프링이 자동으로 애플리케이션 내의 클래스들을 검색하여 스프링 빈으로 등록하는 기능

     강의에서는 @Controller 라는 annotation을 통해 자동으로 클래스들을 스프링 빈으로 등록시켰다!

 

(cf.스프링 빈(Spring Bean)은 스프링 프레임워크의 핵심 개념으로, 스프링 컨테이너가 생성, 관리하는 자바 객체를 의미)

 

2. 자동 의존관계란?

스프링이 빈 간의 의존관계를 자동으로 주입하는 기능이다. 주로 @Autowired 라는 annotation을 사용한다!

     의존성을 주입한다는 의미에서 Dependancy Injection(DI)라고도 불린다.

 

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

 

스프링 빈을 등록하는 방법에는 두 가지 방법이 있는데 첫번쨰가 컴포넌트 스캔과 자동 의존관계 설정이였다.

두 번째 방법으로는 자바 코드로 직접 스프링 빈을 등록하는 방법이다.

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

다른 클래스에서 작성했던 annotation을 제거하고 새로 SpringConfig 클래스를 만들어서 직접 스프링 빈을 등록하면 된다. 1번의 경우 그냥 annotation만 붙이면 되니까 그게 무조건 좋은 거 아니냐라고 생각할 수 있지만 2번의 장점은 구현 클래스를 쉽게 변경할 수 있다는 점이다. 예를 들어, 데이터 저장소를 변경해야 할 경우, 구성 클래스만 수정하면 되기 때문!


#섹션6

회원 웹 기능 - 홈 화면 추가

이 작업은 이와 같이 홈화면에 접속했을 떄 회원 가입 및 회원 목록 칸을 개발하는 과정이다.

방법은 controller에 HomeController 클래스를 만들어주고 home.html을 이어서 templates에 만들어주면 된다.

회원 웹 기능 - 등록

이 작업은 홈화면에서 회원 가입을 클릭했을 때 members/new로 이동해서 이름을 입력해 등록할 수 있는 공간을 만들어주는 과정으로 controller에 MemberController클래스를 만들고 "/members/new"의 경로를 PostMapping해주면 된다. createMemberForm.html을 templates에 만들고 MemberForm이라는 클래스를 controller에 생성해서 데이터를 전달 받을 객체를 생성해준다.

 

(cf. GetMapping vs PostMapping)

  • GetMapping 은 url에 데이터를 포함하여 전송하며 서버 상태의 변화가 이루어지지 않아 보통 데이터 조회에 사용된다.
  • PostMapping 은 데이터를 body(요청 본문)에 포함하여 전송하기에 서버 상태의 변화가 이루어질 수 있다. 따라서 데이터 생성 및 수정에 사용되는 편이다.

 

회원 웹 기능 - 조회

이 작업은 홈화면에서 회원 가입을 통해 이름을 입력해서 등록한 경우, 해당 정보를 홈화면의 회원 목록을 클릭 했을 때 등록 정보를 표시하게끔 하는 과정이다. 회원 가입에서 r1과 r2를 임의로 등록했고 위 사진은 그것의 결과이다.

방법은 MemberController클래스에 /members를 맵핑해주고 list 메서드를 하나 만들어주면 된다.

해당 메서드에서 memberService.findMembers()를 통해 회원 목록을 조회하고, 이를 model에 담아 뷰로 전달하면 된다.

 

memberList.html 또한 만들어주어야 하는데 members목록을 반복해서 돌면서 member의 속성인 name을 표시해주는 방식이다.

 

(cf. 회원 컨트롤러에서 list 메서드의 반환값이 "members/memberlist"인 이유는 Thymeleaf와 같은 템플릿 엔진에서는 .html 확장자를 사용하여 /templates/members/memberList.html와 같은 경로에서 뷰 파일을 찾기 때문이다!)

 


 

반응형