Open snaag opened 1 year ago
@Component
package hello.hellospring;
@SpringBootApplication
public class HelloSpringApplication {
public static void main(String[] args) {
SpringApplication.run(HelloSpringApplication.class, args);
}
}
hello.hellospring
package 에 속해있거나, 그 하위 package 만 scan 함package hello.hellospring.controller;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
package hello.hellospring.service;
@Service
public class MemberService {
private final MemberRepository memberRepository;
// 외부에서 memoryRepository 를 넣어줌 => Dependency Injection (DI)
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
package hello.hellospring.repository;
@Repository
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
}
필드 주입 ❌
@Controller
public class MemberController {
@Autowired private MemberService memberServie;
}
setter 주입 ❌
@Controller
public class MemberController {
private MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
}
생성자 주입 ✅
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
package hello.hellospring;
@Configuration
public class SpringConfig {
// spring bean 에 등록하라는 뜻
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home";
}
}
- 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";
}
}
package hello.hellospring.controller;
public class MemberForm {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<!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 --->