Java MVC 패턴(feat. service의 역할)

이수빈·2023년 8월 3일
0

Spring

목록 보기
1/4

MVC 패턴이란?

  • Model - View - Controller로 계층을 나누어 View로직과 Business로직을 분리하는 디자인패턴임.

ref) https://velog.io/@khy226/MVC

Model

  • 데이터를 처리하는 영역
  • DAO(데이터베이스와 연동하는부분), DTO(DATA Transfer Object), Entity에 해당이 됨
  • View와 Controller에 의존하지 않아야함.

DTO(Data Transfer Object)

  • 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;
        ...
    }
}

Entity

  • DTO와의 차이점 => DB와 직접 매핑이 된다는 점임. 약간의 설정을 바구면 DB스키마가 자동으로 생성, 수정됨

  • 데이터베이스 테이블 각열은 => Entity 멤버변수로 매핑됨

  • 각 행은 => 클래스 인스턴스로 표현됨.

DAO(DATA ACCESS OBJECT)

  • 데이터베이스에 관련된 작업들을 담당하는 객체임.

  • 데이터베이스에서 데이터 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;
    }
}

View

  • UI, 사용자에게 보여지는 부분임

Controller

  • 클라이언트의 요청을 처리함 => 비즈니스 로직은 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();
    }
}

Service

  • Service는 Controller와 Model의 중간다리역할, Controller에서 비즈니스로직 분리하기 위해 사용함.

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();
    }
}

의존성 주입(Dependency Injection)

  • 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

profile
응애 나 애기 개발자

0개의 댓글