[View] DispatcherServlet 을 통해 사용자의 요청을 View 영역에서 받고,
받은 요청을 @Controller 영역에 전달
@Controller 영역에서는
사용자의 요청을 에 알맞게 메소드를 실행 ( Front Controller 방식을 통해 )
@Controller 영역에서 생성되는 메소드들은 모두
자바 객체인 Bean 형태로 생성되고
생성 된 Bean 객체가
@Repository , @service 어노테이션을 적용받아
스프링 컨테이너 내부에서 이동이 가능하다
@Service 어노테이션은 스프링 컨테이너 내부에서 서비스 로직을 담당
( 내부 java 메소드의 연결 + 저장 + 호출 을 담당 )
@Repository 어노테이션은 스프링 컨테이너 내부에서 외부 I/O 처리 ( Input/Output )
즉, 외부 DB 와 연결하고 저장 및 호출을 담당
ex)
사용자의 요청에 맞게 서비스를 실행하는 컨트롤러 영역
Spring Boot 에서 @Controller 어노테이션을 사용하면
기본적으로 사용자에 요청에 따라 달라지는
Front Controller 의 역할을 가지고 있다.
View 영역의 form 태그 액션 값에 따라
실행되는 컨트롤려 영역이 나뉘어 진다.private final MemberService memberService; /* * 클래스의 의존관계를 @Autowired 어노테이션 한번의 선언만으로 * 스프링 컨테이너가 자동으로 연결해 주는 것. * Java 내부 메소드 실행을 담당하는 @Service 어노테이션을 연결함으로 써 * * 사용자 요청에 알맞게 @Controller 어노테이션의 업무를 실행 * * 쉽게말해, @Controller 어노테이션과 @Service 어노테이션을 잇겟다는 의미 */ @Autowired public MemberController(MemberService memberService) { this.memberService = memberService; } @GetMapping(value = "/members/new") public String createFrom() { return "members/createMemberForm"; } @PostMapping(value = "/members/new") public String create(MemberFormDTO form) { /* 사용자가 이름을 입력하면 * 해당 이름을 MemberFormDTO 값에 저장하고 * @ Serivce의 join(member)를 실행하여 java 메소드 내에 저장 * 저장된 데이터가 @Repository 를 통해 DB에 저장 */ Member member = new Member(); member.setName(form.getName()); memberService.join(member); // @Controller -> @Service -> @Repository 업무가 모두 끝나면 홈 화면으로 리턴 return "redirect:/"; // return "forward:/"; } @GetMapping("/members") public String list(Model model) { List<Member> members = memberService.findMembers(); model.addAttribute("members", members); return "members/memberList"; }
@Service @Transactional public class MemberService { // MemberRepository memberReposity = new MemoryMemberRepository(); private final MemberReposity memberRepository; /* * 마찬가지로, @Autowired 어노테이션을 통해 * @Service 어노테이션 + @Repository 어노테이션을 연결한다 */ @Autowired public MemberService( MemberReposity memberRepository) { this.memberRepository = memberRepository; } // 회원 가입 public int join(Member member) { memberRepository.save(member); return member.getId(); } // 전체회원 조회 public List<Member> findMembers(){ return memberRepository.finaAll(); }
+ JPA 를 통해 어떠한 DB 환경이더라도 자동으로 환경에 맞추어
대량의 데이터 Input / Output 를 실행한다.
@Repository public class JpaMemberRepository implements MemberReposity { // JPA(@Entitiy)를 EntitiyManager 를 통해 모든지 동작 가능하다. private final EntityManager em; public JpaMemberRepository(EntityManager em) { this.em = em; } @Override public Member save(Member member) { // 멤버 data 저장 em.persist(member); return member; } @Override public List<Member> finaAll() { // select 한 내용을 "모두" 리턴하는 메소드 return em.createQuery("select m from Member m", Member.class).getResultList(); /* * select m from Member m : JPQL 이라는 쿼리 */ }
// @Entitiy : JPA 가 관리하는 클래스 @Entity public class Member { // PK 키 @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySequence") @SequenceGenerator(name = "mySequence", sequenceName = "member_seq" , allocationSize = 1) private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }