qualified750
190
2021-05-18 01:38:41 작성 2021-05-18 05:51:53 수정됨
2
189

spring mvc url바뀔때마다 model에 attribute를 추가 하고싶습니다.


안녕하세요 졸업작품때문에 머리 쥐어뜯는 초보 개발자지망생입니다.

이 사이트를 공부하며 많이 참고했으나 글은 처음 적어보네요.


지금 졸업작품으로 부동산 서비스를 만들고 있는데요.


네이버 맵 api위에 부동산 웹 서비스를 만들고 추가적인 기능을 구현하고 싶은데 부동산 자체도 힘드네요 ㅜㅜ


지금 제가 대충 부동산 매물이 지도에 보이게는 만들었는데 약간 억지로 만들었습니다.

사이트에 들어오면 서버에서 서울 성북구의 모든 부동산 매물(크롤링으로 얻은)을 jsp로 보냅니다.

model.addAttribute()를 통해서입니다.

이것을 jstl로 자바스크립트 객체로 만든다음 지금 보고있는 화면 안에 해당하는 매물만 보여주는 방식입니다.


문제는 거의 모든 연산이 자바스크립트에서 이루어진다는 것입니다.

모든 매물의 객체화 + 화면 좌표 안에 포함되는지 연산 + 매물 정보창 생성까지 여기에 추가적인 기능을 추가하면 연산량은 더 많아질 것 같습니다.


지금은 성북구의 데이터만 가지고 있어서 메모리도 별로 차지 안하고 연산량도 적어 랙이 걸리지 않지만 아무래도 전국으로 확장한다는 가정이라면 바람직 하지는 못하다고 생각합니다.


해서 서버쪽으로 연산들을 옮기고 싶은데요


처음에는 그저 지도를 움직이면 가운데 좌표와 화면 끝 좌표들을 서버로 post하고 그 정보들을 통해서 해당하는 매물을 연산한 다음 그것들을 model.addAttribute()하면 될거라고 생각했습니다.


그러나 model.addAttribute()는 사이트를 처음 접속했을때 딱 1번만 작동하더군요...


해서 다른 url을 mapping 한다음 좌표가 바뀔때마다 자바스크립트의 history.pushState()함수로 url을 바꿔서 새로운 url로 접속해서 데이터를 받으려고해도 해당하는 포맷의 url 마다 단 1번만 request.getSession().setAttribute()가 작동합니다.

정확히는 데이터는 보내지는데 자바스크립트에서 이벤트 리스너 안에 작성한 jstl이 처음 url이 바뀌어 redirect될때 딱 1번만 동작하는 것 같습니다. 나머지 자바스크립트 코드는 계속 동작하는데 새로운 매물이 보내졌을텐데도 자바스크립트 객체가 생성이 안됩니다. 


어떤 방법을 사용하면 새롭게 연산된 객체리스트를 클라이언트쪽에서 요청할때마다 보내줄 수 있을까요? 제가 부족해서 이러한 방식의 프로그래밍을 뭐라고 검색해야 할지도 모르겠네요 ㅜㅜ


선배님들의 고견을 듣고싶습니다.

제가 작성한 컨트롤러 입니다.

@Controller
public class HomeController {

	@Autowired
	private EstateService estateService; //데이터 베이스 dao를 호출하기위한 service입니다.

	private double x_coord = 0;
	private double y_coord = 0;
	private double maxBoundX = 0;
	private double maxBoundY = 0;
	private double minBoundX = 0;
	private double minBoundY = 0;
	private int zoom;

	List<Estate> estates;//전체 부동산 매물 객체 리스트입니다.
	ArrayList<Estate> availableEstates;//연산 후 서버로 보내줄 객체 리스트입니다.

	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(HttpServletRequest request, Model model) throws IOException, ParseException {
		estates = estateService.getCurrent();//모든 매물 객체를 DB에서 받아와 리스트에 넣습니다.
		model.addAttribute("estates", estates); //모든 매물 객체를 jsp로 보냅니다.
		return "home";
	}

	@RequestMapping(value = "/{x}/{y}", method = { RequestMethod.POST, RequestMethod.GET })
	public void doPost(HttpServletRequest request, HttpServletResponse response, Model model)
			throws ServletException, IOException {

		estates = estateService.getCurrent();


		if (request.getParameter("x") != null) {
  
			availableEstates = new ArrayList<Estate>();
			x_coord = Double.parseDouble(request.getParameter("x"));
			y_coord = Double.parseDouble(request.getParameter("y"));
			maxBoundX = Double.parseDouble(request.getParameter("maxX"));
			maxBoundY = Double.parseDouble(request.getParameter("maxY"));
			minBoundX = Double.parseDouble(request.getParameter("minX"));
			minBoundY = Double.parseDouble(request.getParameter("minY"));
			zoom = Integer.parseInt(request.getParameter("zoom"));
			
			for (Estate estate : estates) {//매물 객체가 브라우저 화면 안에 포함되는지 판단합니다.
				if (Double.parseDouble(estate.getX_coord()) < maxBoundX && Double.parseDouble(estate.getY_coord()) < maxBoundY
						&& Double.parseDouble(estate.getX_coord()) > minBoundX && Double.parseDouble(estate.getY_coord()) > minBoundY) {
					availableEstates.add(estate);
				}
			}
			
			request.getSession().setAttribute("availableEstates", availableEstates);//연산이 완료된 객체 배열을 페이지로 보냅니다.
			response.sendRedirect("/salgosipda_capstone/"+x_coord+"/"+y_coord);
			
			return null;
		}
		else {
			return "redirect:/"; //새로고침을 하면 초기화면으로 돌아갑니다.
		}
	}
	}
}



0
  • 답변 2

  • chlguswns980105
    149
    2021-05-18 11:06:00 작성 2021-05-18 11:06:53 수정됨

    ajax를 사용하시면 되지 않을까 싶네요.

    jQuery로는 $.ajax(object); 하여 호출할 수 있고 

    바닐라 js는 XMLHttpRequest 사용하시면 돼요

  • qualified750
    190
    2021-05-18 19:29:11

    감사합니다 해보겠습니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.