본문 바로가기

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

[2025 겨울방학 스프링 스터디] 정채은 #3주차

반응형

섹션 5 와 섹션 6 ...........

 

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

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 : 객체 생성 시점에 스프링 연관된 객체를 스프링 컨테이너에서 찾아 주입

 

객체 의존 관계를 외부에서 넣어주는 것  → DI(Dependency Injection), 의존성 주입

 

 

@Controller 있으면 자동 등록

 

@Controller , @Service , @Repository를 각 클래스 선언 위에 추가해주기 → 컴포넌트 스캔

 

스프링 빈으로 자동 등록 되는 @Component 를 포함하는 애노테이션

  • @Controller 
  • @Service
  • @Repository

 

@Autowired : 위 그림에서의 연결 의미

 

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

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 {

    // memberService를 스프링 빈으로 등록
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository()); // 스프링 빈에 등록되어 있는 MemberRepository를 MemberService에 넣어줌
    }

    // memberRepository를 스프링 빈으로 등록
    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

 

정형화된 컨트롤러, 서비스, 리포지토리 같은 코드 : 컴포넌트 스캔

정형화 X , 상황에 따라 구현 클래스 변경 : 설정을 통해 스프링 빈으로 등록

 

@Autowired를 통한 DI : 스프링이 관리하는 객체에서만 동작

 

 

 

 

 

[회원 웹 기능 - 홈 화면 추가 ]

<홈 컨트롤러>

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

 

<회원 관리용 홈>

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

 

<실행 결과>

[ 회원 웹 기능 -  등록]

<회원 등록 컨트롤러>

package hello.hellospring.controller;

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

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired    
    public MemberController(MemberService memberService) {

        this.memberService = memberService;
    }

/*
회원 등록 폼 컨트롤러 추가
*/
    @GetMapping("/members/new")
    public String createHome() {
        return "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>

 

<실행 결과>

 

[ 회원 웹 기능 -  조회]

< 회원 컨트롤러에서 조회 기능 추가 >

@GetMapping("/members")
    public String list(Model model) {
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members);
        return "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>

 

<실행결과>

반응형