JAVA/Spring

Spring 구조와 @들 그리고 Controller-mapping-service

whyHbr 2022. 12. 4. 16:12
728x90
반응형

Spring 구조

 모델 2방식에서의 사용자 Request는 특별한 상황이 아닌 이상 먼저 컨트롤러를 호출하게된다.

이렇게 설계하는 가장 중요한 이유는 나중에 뷰를 교체하더라도 사용자가  호출하는 URL 자체에 변화가 없게 만들어 주기 때문이다.

컨트롤러는 데이터를 처리하는 존재를 이용해서 데이터 (model) 을 처리하고 Response 할 때 필요한 데이터(모델) 을 뷰 쪽으로 전달하게 된다. 

Spring MVC 기본 구조
계층에 대한 설명을 Spring MVC 와 맞춰 설명

 SpringMVC 영역은 presentation Tier를 구성하게 되는데 각 영역은 사실 별도의 설정을 가지는 단위로 볼 수 있다.

Spring core 영역은 흔히 POJO(Plain Old Java Object) 의 영역. 스프링의 의존성 주입을 이용해 객체 간의 연관구조를 완성해서 사용한다.

Mybatis 영역은 현실적으로는 mybatis-spring 을 이용해 구성하는 영역, SQL에 대한 처리를 담당하는 구조이다.

 

 

controller  //controller - url ( localhost/board/list ) - service - mapper - db - mapper - service - controller - view

 

@Controller // 모델과 뷰를 연결시켜준다?. 오버라이딩을 올바르게 했는지 컴파일러가 체크한다.?
@Log4j // 프로그램이 돌아가면서 필요한 내용에 대한 로그를 남기는 기능 제공
@RequestMapping("/board/*") //  경로와 해당하는 컨트롤러를 매칭 할 수 있게 해주는 영역
@AllArgsConstructor // 클래스의 모든 필드에 대한 생성자를 자동으로 생성 

public class BoardController {

 
private BoardService service;
 
@GetMapping("/list") //localhost:8080 list 요청이 들어오면 아래의 함수를 실행.
public void list(Model model) {
 
log.info("list");
model.addAttribute("list",service.getList());
}
 
@PostMapping("/register") //주어진 URI 표현식과 일치하는 HTPP POST 요청을 처리
public String register(BoardVO board, RedirectAttributes rttr) {
log.info("register: + board");
service.register(board);
rttr.addFlashAttribute("result",board.getBno());
 
return "redirect:/board/list";
}
 
@GetMapping("/get/")  //localhost8080 get 처리가 들어오면 아래의 함수를 실행
public void get(@RequestParam("bno") Long bno,Model model) {
log.info("/get");
model.addAttribute("board",service.get(bno));
}
 
@PostMapping("/modify")  //요청처리, 주어진 URI 표현식과 일치하는 HTPP POST 요청을 처리
public String modify (BoardVO board, RedirectAttributes rttr) {
log.info("modify: "+ board);
 
if(service.modify(board)) {
rttr.addFlashAttribute("result","success");
}
return "redirect:/board/list";
}
 
@PostMapping("/remove") //요청처리, 주어진 URI 표현식과 일치하는 HTPP POST 요청을 처리
public String remove(@RequestParam("bno")Long bno, RedirectAttributes rttr) {
log.info("remove. . . " + bno);
if(service.remove(bno)) {
rttr.addFlashAttribute("result","success");
}
return "redirect:/board/list";
}
 
@GetMapping("/register")
public void register() {
 
}
 
 
@GetMapping("/readone")
public void read_one(Model model) {
log.info("read one page open");
model.addAttribute("board",service.getone());
}
 
@GetMapping("/getcount")
public void howmany(Model model) {
model.addAttribute("count",service.getcount());
 
}
 
@GetMapping("/getmax")
public void get_max(Model model) {
model.addAttribute("bno",service.getmax());
 
}
 
 
 
}

------------------------------------

Mapping

BaordMapper
 
package org.zerock.mapper;
 
import java.util.List;
 
import org.apache.ibatis.annotations.Select;
import org.zerock.domain.BoardVO;
 
public interface BoardMapper {
//@Select("select * from tbl_board3 where bno > 0")
public List<BoardVO> getList();
public void insert(BoardVO board);
public void insertSelectKey(BoardVO board);
public BoardVO read(Long bno);
public int delete(Long bno);
public int update(BoardVO board);
 
 
 
public BoardVO getone();
public int getcount();
public int getmax();
}
 
 
-------------------------------------------

Service

package org.zerock.service;
 
import java.util.List;
 
import org.zerock.domain.BoardVO;
 
public interface BoardService {
public void register (BoardVO board);
 
public BoardVO get(Long bno);
 
public boolean modify(BoardVO board);
 
public boolean remove (Long bno);
 
public List<BoardVO> getList();
 
 
public BoardVO getone();
public int getcount();
public int getmax();
 
}
 
------------------------------------

 

BoardServiceimpl 

 
 
 
package org.zerock.service;
 
import java.util.List;
 
import org.springframework.stereotype.Service;
import org.zerock.domain.BoardVO;
import org.zerock.mapper.BoardMapper;
 
import lombok.AllArgsConstructor;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
 
@Log4j //프로그램이 돌아가면서 필요한 내용에 대한 로그를 남기는 기능을 제공
@Service // 정보를 가공하여 Controller 에게 데이터를 넘긴다.
@AllArgsConstructor // 모든 필드에 대한 생성자를 생성합니다. 
public class BoardServiceimpl implements BoardService {
 
    private BoardMapper mapper;
 
@Override
public void register(BoardVO board) {
 
}
 
@Override
public List<BoardVO>getList(){
log.info("getList . . . ");
return mapper.getList();
}
 
@Override
public BoardVO get(Long bno) {
log.info("get . . ."+bno);
 
return mapper.read(bno);
}
 
@Override
public boolean modify(BoardVO board) {
 
log.info("modify . . ."+board);
return mapper.update(board)==1;
}
 
@Override
public boolean remove(Long bno) {
log.info("remove . . . "+ bno);
 
return mapper.delete(bno)==1;
}
 
@Override
public BoardVO getone(){
return mapper.getone();
}
 
@Override
public int getcount(){
return mapper.getcount();
}
 
@Override
public int getmax(){
return mapper.getmax();
}
 
 
}
 
----------------------
BoardVO
package org.zerock.domain;
 
import java.util.Date;
 
import lombok.Data;
 
@Data
public class BoardVO {
private Long bno;
private String title;
private String content;
private String writer;
private Date regdate;
private Date updateDate;
 
 
}
 
------------------------------------------
 
Controller
 
@GetMapping("/list") //localhost:8080 list 요청이 들어오면 아래의 함수를 실행.
public void list(Model model) {
 
log.info("list");
model.addAttribute("list",service.getList());
}
 

BoardMapper

public interface BoardMapper {
public List<BoardVO> getList();
 

 

Service

public interface BoardService {

public void register (BoardVO board);
}

 

BoardServiceimpl 

public class BoardServiceimpl implements BoardService {

 
    private BoardMapper mapper;
 
 
@Override
public List<BoardVO>getList(){
log.info("getList . . . ");
return mapper.getList();
}

 

BoardVO

public class BoardVO {
private Long bno;
}

 

 

------------------------------------------

 

@Override = 오버라이딩을 올바르게 했는지 컴파일러가 체크한다.
상속받은 메서드를 재정의할 때 메서드 이름이 틀리지 않게 쓰기 위한 어노테이션
@Controller - 모델과 뷰를 연결시켜줌

@RequestMapping()
경로와 해당하는 컨트롤러와 매칭할 수 있도록 해주는 기능

@Log4j
프로그램이 돌아가면서 필요한 내용에 대한 로그를 남기는 기능을 제공

객체를 주입받는 방법
@Autowired =@Autowired란 스프링 컨테이너에 등록한 빈에게 의존관계주입이 필요할 때, DI(의존성 주입)을 도와주는 어노테이션이다.
@AllArgsConstructor = - 모든 필드에 대한 생성자를 생성합니다. 
또한 의존성 주입 할 대상이 많아졌을 때 훨씬 깔끔합니다.
클래스의 모든 필드에 대한 생성자를 자동으로 생성합니다.

@Service DB에서 받아온 데이터를 전달받아 가공하는 것이다
.  내부에서 자바 로직을 처리함
알맞은 정보를 가공하여 Controller 에게 데이터를 넘긴다.

@RequiredArgsConstructor
클래스의 final 필드에 대한 생성자를 자동으로 생성합니다. 
final 필드는 클래스에서 초기화를 하던지 객체 생성 시 생성자를 이용해 꼭 초기화해줘야 합니다.

@GetMapping("/list")
localhost:8080/list 요청이 들어오면 아래의 함수를 실행.

@PostMapping("/register") 요청처리,POST 통신을 할때는
 어노테이션이있는 메소드는 주어진 URI 표현식과 일치하는 HTTP POST 요청을 처리합니다.
주어진 URI 표현식과 일치하는 HTTP POST 요청을 처리.
(에노테이션은 주석이라는 의미를 가진다,컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공)
@RequestMapping(value = "/register",method = {requestMethod.POST}) 을 줄여 쓸 수 있음. 간단하게 사용 가능

728x90

'JAVA > Spring' 카테고리의 다른 글

Spring MVC, DDD  (0) 2024.04.14
스프링의 주요 개념 : IoC, DI, Container, Bean  (0) 2024.04.14
게시판 CRUD  (0) 2022.12.06