ref) https://velog.io/@khy226/MVC
Client와 통신할때 사용하는 객체 => Request DTO Response DTO가 존재함
이런식으로 통신시 어떤 필드를 받는지 미리 정의하는 형태로 사용함.
public class LoginDTO{
public static class Requset{
private String id;
private String pw;
}
public static class Response{
private int no;
private String email;
private String id;
private String nickName;
...
}
}
DTO와의 차이점 => DB와 직접 매핑이 된다는 점임. 약간의 설정을 바구면 DB스키마가 자동으로 생성, 수정됨
데이터베이스 테이블 각열은 => Entity 멤버변수로 매핑됨
각 행은 => 클래스 인스턴스로 표현됨.
데이터베이스에 관련된 작업들을 담당하는 객체임.
데이터베이스에서 데이터 CRUD 수행 => 데이터 엑세스과정 추상화
public interface MemberRepository {
Member save(Member member);
Member findById(Long id);
List<Member> findAll();
}
@Repository
public class MemberRepositoryImpl implements MemberRepository {
private Map<Long, Member> memberDatabase = new HashMap<>();
@Override
public Member save(Member member) {
member.setId(generateId());
memberDatabase.put(member.getId(), member);
return member;
}
@Override
public Member findById(Long id) {
return memberDatabase.get(id);
}
@Override
public List<Member> findAll() {
return new ArrayList<>(memberDatabase.values());
}
private Long generateId() {
// 가짜 ID 생성 로직
return memberDatabase.size() + 1L;
}
}
클라이언트의 요청을 처리함 => 비즈니스 로직은 Service를 통해 분리함
Spring Boot에서 Controller는 @RestController 또는 @Controller 어노테이션으로 표시되며, @RequestMapping 또는 다른 특정 HTTP 메서드 어노테이션(@GetMapping, @PostMapping, 등)을 사용하여 어떤 요청을 처리할지 지정할 수 있음.
@RestController
@RequestMapping("/members")
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@PostMapping("/register")
public Member registerMember(@RequestParam String name, @RequestParam String email) {
return memberService.registerMember(name, email);
}
@GetMapping("/{id}")
public Member findMemberById(@PathVariable Long id) {
return memberService.findMemberById(id);
}
@GetMapping("/all")
public List<Member> getAllMembers() {
return memberService.getAllMembers();
}
}
public interface MemberService {
Member registerMember(String name, String email);
Member findMemberById(Long id);
List<Member> getAllMembers();
}
@Service
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Override
public Member registerMember(String name, String email) {
Member newMember = new Member();
newMember.setName(name);
newMember.setEmail(email);
return memberRepository.save(newMember);
}
@Override
public Member findMemberById(Long id) {
return memberRepository.findById(id);
}
@Override
public List<Member> getAllMembers() {
return memberRepository.findAll();
}
}
DI약자, Controller에서 Service을 호출해서 로직을 처리함. Service단의 코드가 변경되면 Controller 또한 영향을 받음.
만약에 Hello Controller에서 다른 서비스를 통해 코드를 처리해야 할경우, Controller의 코드를 직접 변경해야함(코드변경 후 재배포 작업이 필수임)
HelloService라는 Interface를 생성한다음 의존하도록 만든다.
Hello Service interface를 각각의 Service들이 구현하도록 만든다.
코드레벨에서는 의존하고 있지 않지만, Runtime에는 Controller는 서비스를 구현한 Object를 이용해야함
의존성주입을 하는 주체 => Assembler임 (외부에서 Object를 만들어 주입을 해주는 역할임) 이 Assembler가 Spring Container임.
Object 참조값을 넘겨주는게 주입해주는 방식.
Hello Controller를 만들 때 생성자 필드로 Simple Hello Service Object를 주입해주는 방법 존재.
Bean을 등록하고 => mapping에 대한 요청 처리
Bean을 가져와서 요청에 대한 응답 처리해야함.(dispatch Servlet 없이 구현한 코드)
ref) https://binco.tistory.com/entry/Java-MVC%ED%8C%A8%ED%84%B4-%EB%B0%94%EB%A1%9C%EC%95%8C%EA%B8%B0