public class Member {
private Long memberId;
private String email;
private String name;
private String phone;
public Member(Long memberId, String email, String name, String phone){
this.memberId = memberId;
this.email = email;
this.name = name;
this.phone = phone;
}
public Long getMemberId(){
return memberId;
}
public void setMemberId(Long memberId){
this.memberId = memberId;
}
----------------------------------------------
public String getEmail(){
return email;
}
public void setEmail(String email){
this.email = email;
}
-----------------------------------------------
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
-----------------------------------------------
public String getPhone(){
return phone;
}
public void setPhone(String phone){
this.phone = phone;
}
}
항목별로 다 get, set 정의를 해준다.
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class MemberRepository {
private static Map<Long, Member> members = new HashMap<>();
public void postMember(Member member){
members.put(member.getMemberId(), member); //역시 리턴값이 없다. 그냥 Map에 넣어준다. (ID, 멤버 이름)으로 구분
}
public Member getMember(Long memberId){
return members.get(memberId); // 위에 저장된 ID를 불러온다.
}
public void deleteMember(Long memberId){
members.remove(memberId);
}
}
@Component 에너테이션을 붙이면 앞으로 이 리소스가 @ComponentScan에 의해 Bean으로 이용된다는 말임. 따라서 일일히 Bean 지정을 안해줘도 최상위에 @Component 만해줘도 됨
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
@Component
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
public void createMember(Member member){
memberRepository.postMember(member); // 리턴값을 보여줄 필요 없음. 등록된거만 알려주면 됨.
}
public Member getMember(Long memberId){
return memberRepository.getMember(memberId); //리턴값을 꼭보여줘야함
}
public void deleteMember(Long memberId){
memberRepository.deleteMember(memberId);
}
}
역시 @Comppnent가 붙어 있음.
@ComponentScan & @Component만 사용했을 때에 DependencyConfig에 어떤 의존 객체를 주입할지 명시해주지 않기 때문에 의존 주입이 필요한 생성자 부분에 @Autowired를 통해 의존 관계 주입이 필요합니다.
import com.example.section2week4.DependencyConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MemberTest {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(DependencyConfig.class);
MemberService memberService = ac.getBean("memberService", MemberService.class);
//이코드로 인해 클라이언트는 DependencyConfig에만 집중하면된다. 결국 그코드가 어떤것인지는 몰라도
//config 파일에서 알아서 다 조정을 해준다고 볼 수 있다.
Member member = new Member(0L, "dlwjddus16@naver.com", "Kimcoding", "010-4152-6543");
memberService.createMember(member);
// 정의를 내려준 대로 리소스를 한번에 등록한다.
Member currentMember = memberService.getMember(0L);
// 현재멤버를 조회할 카테고리를 만든다.
System.out.println("회원 가입한 유저 : " + member.getName());
System.out.println("현재 첫번째 유저 : " + currentMember.getName());
// Member의 getName 메서드를 불러온다.
if(member.getName().equals(currentMember.getName())){
System.out.println("새롭게 가입한 사용자와 현재 사용자가 같습니다.");
}
memberService.deleteMember(0L);
if(memberService.getMember(0L) == null){
System.out.println("회원 삭제가 정상적으로 완료되었습니다.");
}
}
}
ApplicationContext로 스프링 컨테이너를 형성하고 ac라고 이름을 붙여준다.
그것을 MemberService에서 ac.getBean으로 호출하여 memberService를 이용한다.
@Configuration
@ComponentScan
public class DependencyConfig {
}
@ComponentScan만 설정해주더라도 정상작동됨을 알 수 있다. 이는 ComponentScan이 모든 @Component를 읽어와서 적용시키기 때문이다.
전체적인 흐름을 살펴보면 MemberTest 에서 명령을 내려주면 그것을 MemberService에서 1차적으로 받아 실행한다.
MemberService 는 MemberRepository와 연결되어있고, MemberRepository는 Member정보와 연결되어있다.
계단식으로 하나하나 안쪽으로 들어가는 구조이며, 대부분의 데이터를 구분할때 파라미터로 memberId를 이용함을 알 수 있다.