snaag / TIL

https://github.com/snaag/todo3/issues
3 stars 0 forks source link

22-12-03-SAT #17

Open snaag opened 1 year ago

snaag commented 1 year ago
snaag commented 1 year ago

스프링 입문강의 > 컴포넌트 스캔과 자동 의존관계 설정

스프링 빈과 의존관계

Spring 이 관리하게 하기 (1)

Spring 이 관리하게 하기 (2) - @Component & @Autowired

아무데서나 @Component 를 붙여도 Spring bean 으로 등록이 될까?

package hello.hellospring;

@SpringBootApplication
public class HelloSpringApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloSpringApplication.class, args);
    }
}

코드

전체 구조

스크린샷 2022-12-03 오후 6 35 17

MemberController @Controller

package hello.hellospring.controller;

@Controller
public class MemberController {

    private final MemberService memberService;

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

MemberService @Service

package hello.hellospring.service;

@Service
public class MemberService {
    private final MemberRepository memberRepository;

    // 외부에서 memoryRepository 를 넣어줌 => Dependency Injection (DI)
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

MemoryMemberRepository @Repository

package hello.hellospring.repository;

@Repository
public class MemoryMemberRepository implements MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;
}
snaag commented 1 year ago

스프링 입문강의 > 자바 코드로 직접 스프링 빈 등록하기

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

의존관계 주입 DI (Dependency Injection)

방법 3가지

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

package hello.hellospring;

@Configuration
public class SpringConfig {

    // spring bean 에 등록하라는 뜻
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
snaag commented 1 year ago

스프링 입문강의 > 회원 관리 예제 - 웹 MVC 개발

전체 구조

스크린샷 2022-12-03 오후 9 54 02

코드

Controller


- hello.hellospring.controller/MemberController.java
```java
@Controller
public class MemberController {

    private final MemberService memberService;

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

    @GetMapping("/members/new")
    public String createForm() {
        return "members/createMemberForm";
    }

    @PostMapping("/members/new")
    public String create(MemberForm form) {
        Member member = new Member();
        member.setName(form.getName());
        /**
         * form.setName 을 하지 않아도 되었던 이유 :
         *   createMemberForm.html 의 8번째줄에 있는 input tag 의 name="name" 이라서,
         *   MemberForm.java 안의 name 에 대한 setter 인 setName 이 호출되었기 때문.
         *
         *   따라서, input tag 의 name="name2" 라면, MemberForm.java 의 setName 은 호출 되지 않음
         */
        System.out.println("member.getName() = " + member.getName());

        memberService.join(member); // memberService 에서 join logic 수행함

        return "redirect:/"; // home 화면으로 redirect 시킴
    }

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

MemberForm

package hello.hellospring.controller;

public class MemberForm {
    private String name;

    public String getName() {
        return name;
    }

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

html


- templates/members/createMemberForm.html
```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="이름을 입력하세요">
            <!-- 요 name("name") 을 보고, MemberForm.java 의 setName 을 통해 값 넣어줌-->
        </div>
        <button type="submit">등록</button>
    </form>
</div> <!-- /container -->
</body>
</html>
snaag commented 1 year ago

실습

디렉토리 구조

스크린샷 2022-12-04 오전 1 23 14

View, Controller 구조

스크린샷 2022-12-04 오전 1 22 22