본문 바로가기
Spring

[Spring] 07-1. 어노테이션의 종류(@RequestMapping,@Controller)

by ssunooo 2024. 10. 10.

 

 

@RequestMapping

 

1. 정의

  • 요청을 특정 메서드에 매핑하기 위해 사용되는 어노테이션

 

2. 특징

  • 해당 URL로 들어오는 요청을 특정 메서드로 매핑
  • HTTP 메서드 지정 -  method 속성을 사용, 특정 HTTP 메서드에 대해 요청 처리
  • 파라미터 및 헤더 매핑 - params 및 headers 속성을 사용, 파라미터나 헤더를 검사하여 조건부로 메서드 매핑
  • 클래스 매핑 - 클래스에 @RequestMapping을 적용시 해당 클래스의 모든 메서드에 대해 기본 URL을 설정

 

 

@Controller

 

1. 정의

  • 웹 애플리케이션 컨트롤러 클래스 정의
  • HTTP 요청을 처리, 뷰 반환

 

2. 특징

  • 요청 처리 - HTTP 요청 수신,처리하는 메서드 정의, 요청 URL에 따라 특정 메서드가 호출
  • 뷰 반환 - 처리 결과에 따라 JSP, Thymeleaf 같은 뷰 이름 반환
  • 모델 데이터 설정 - Model 객체를 통해 뷰에 데이터 전달
  • RESTful API 구축 - @RestController사용, JSON, XML 형태로 응답 반환하는 RESTful 웹 서비스 구축

 

<@Controller, @RequestMapping 사용 예시>

package com.coma.app.view.gym;

import java.util.ArrayList;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.coma.app.biz.gym.GymDAO;
import com.coma.app.biz.gym.GymDTO;

@Controller("gymMain")
public class GymMainPageAction{

	@RequestMapping("/GYMMAINPAGEACTION.do")
	public String gymMain(Model model, GymDAO gymDAO, GymDTO gymDTO) {
		

		//---------------------------------------------------------------------------
		//해당 페이지에서 공통으로 사용할 변수 and 객체
		//View에서 전달해주는 (페이지 번호)변수
		
		// int타입은 null 체크를 할 수 없으므로 Integer타입으로 저장
		Integer page = gymDTO.getPage(); 
		
		//---------------------------------------------------------------------------
		//페이지 네이션을 위해 암벽장 전체 개수를 요청 selectOne
		//페이지 네이션을 위한 페이지 개수를 구하는 로직을 구현
		int page_num = 1; // page_num 초기 변수 지정
		if(page!=null) {
			page_num = page;			
		}
		int gym_size = 5; // 한 페이지에 표시할 게시글 수 설정
		int min_gym = 1; // 최소 게시글 수 초기화

		// 페이지 번호에 따라 최소 및 최대 게시글 수 설정
		if(page_num <= 1) {
			// 페이지 번호가 1 이하일 경우
			min_gym = 1; // 최소 게시글 번호를 1로 설정
		}
		else {
			// 페이지 번호가 2 이상일 경우
			min_gym = ((page_num - 1) * gym_size) + 1; // 최소 게시글 번호 계산
			
		}
		//페이지네이션 값과 condition 값을 DTO에 추가하여 (6개출력)
		gymDTO.setModel_gym_min_num(min_gym);
		gymDTO.setModel_gym_conditon("GYM_ONE_COUNT"); //컨디션 추가해야함

		//암벽장 총 개수를 요청 selectOne
		GymDTO model_gym_total = gymDAO.selectOne(gymDTO);
		
		System.out.println("min_gym"+min_gym);
		// 페이지네이션 에 표시할 min_gym ~ max_gym까지 를 설정
		gymDTO.setModel_gym_min_num(min_gym);
		//암벽장 리스트를 model에 요청 selectAll
		//암벽장 테이블에서 받을 값(암벽장 번호 / 암벽장 이름 / 암벽장 주소)
		ArrayList<GymDTO> model_gym_datas = gymDAO.selectAll(gymDTO);
		System.out.println(model_gym_datas);
		//------------------------------------------------------------
		//지도 API를 사용하기 위해 json 형식으로 보내는 로직
		String json = "[";
		//model_gym_datas 비어 있지 않다면
		if(!model_gym_datas.isEmpty()) {
			for (GymDTO data_gym : model_gym_datas) {
				// datas(크롤링한 암벽장 데이터)만큼 암벽장 이름과
				json += "{\"title\":\"" + data_gym.getModel_gym_name() + "\",";
				// 암벽장 장소를 json 형식으로 쓰여져있는 String 값으로 추가해서
				json += "\"address\":\"" + data_gym.getModel_gym_location() + "\"},";
			}
			// 끝에있는 쉼표 제거한 뒤 저장
			json = json.substring(0, json.lastIndexOf(",")); 
		}
		json+="]";
		System.out.println(json);
		//------------------------------------------------------------

		//암벽장 리스트를 View로 전달
		model.addAttribute("model_gym_datas", model_gym_datas);
		
		//암벽장 전체 개수를 View로 전달
		model.addAttribute("model_gym_total", model_gym_total.getModel_gym_total());
		
		//json 형식 데이터 전송
		model.addAttribute("datas", json);
		
		//암벽장 페이지 페이지 번호를 전달.
		model.addAttribute("page_num", page_num);
		
		return "gymMain";
	}

}

 

 

 

2024.10.10