한페이지 한페이지 옮기다보니 아예 새로운 개념이라 생각이 잘 안나는 경우가 있엇다.
예를들면 Servlet에서 값을을 받아올때 request에서 메서드를 이용해서 받아오는데 Spring의 경우에는 어노테이션을 이용하여서
@RequestMapping(value = "/Login")
public String login(@RequestParam int inputId, @RequestParam String inputPwd, HttpSession session) {
System.out.println("로그인 진입");
System.out.println("ID : " + inputId + " PWD : " + inputPwd);
boolean isAuthenticated = loginService.loginLogic(inputId, inputPwd);
if (isAuthenticated) {
System.out.println("로그인 성공");
Employee employee = loginService.getEmpIdAndEmpDepartmentAndEmpTeam(inputId);
session.setAttribute("employee", employee);
System.out.println("emp_id : " + employee.getEmpId() + " emp_department : " + employee.getEmp_department() + " emp_team : " + employee.getEmp_team());
return MAIN_PAGE;
} else {
System.out.println("로그인 실패");
return LOGIN_PAGE;
}
}
다음과 같이 구현할수가 있었다.
해당값을 자바스크립트에서 바로 받아와서 사용하고싶은데 작동이 되는지 안되는지 정확하게 몰라
<div class="hidden-information">
<input id="emp_department" th:value="${session.emp_info.getEmp_department()}" type="hidden">
<input id="emp_team" th:value="${session.emp_info.getEmp_team()}" type="hidden">
</div>
이런식으로 hidden type으로 메인페이지에서 값을 세팅해두고 필요할때마다 불러와서 사용하려고한다.
사실 옳은 방법같진 않은데 매번 컨트롤러를 왔다갔다하면서 받아오는게 불필요하다고 생각해서 이처럼 진행할생각이다.
이런 캘린더페이지에 DB에서 해당하는 날짜의 회사일정, 부서일정, 개인일정(쓰기, 지우기 가능)을 받아오려고 했는데.
아무래도 날짜와 해당 날짜에 대한 일정리스트(몇개가 들어갈지는 모른다)가 필요하기 때문에
Map<날짜, List<스케쥴>>과 같은 형식으로 만들었더니 해당 값을 되돌려보내주는 방법이 마땅한 방법을 몰라서
검색을 해보니 @ResponseBody를 이용해서 JSON을 리턴해주는 방법이 있엇다.
그리고 해당 @ResponseBody와 @Controller가 조합된 @RestController를 찾게 되었다.
차이점이라면 return해줄때 객체를 리턴해줄수있다는것이었기에 위의 형식의 Map을 Json으로 바꿔서 보내주면 되겠다는 생각을 했다.
JSP+Servlet으로 해당 웹사이트를 만들때 Gson을 사용해본적이 있어서 depenedecy에 Gson을 추가해주고
@GetMapping("/CompanySchedule")
public String CompanySchedule(@RequestParam("selectedYear") int year, @RequestParam("selectedMonth") int month) {
System.out.println("CompanySchedule : " + year + " " + (month + 1));
Map<String, List<String>> companyScheduleList = companyCalenderService.getCompanyCalenderList(year, month + 1);
String json = gson.toJson(companyScheduleList);
System.out.println("Check Json : " + json);
return json;
}
@GetMapping("/TeamSchedule")
public String TeamSchedule(@RequestParam("selectedYear") int year, @RequestParam("selectedMonth") int month, @RequestParam("department") String department) {
System.out.println("CompanySchedule : " + year + " " + (month + 1));
Map<String, List<String>> teamScheduleList = teamCalenderService.getTeamCalenderList(year, month + 1, department);
String json = gson.toJson(teamScheduleList);
System.out.println("check Json : " + json);
return json;
}
위처럼 작성했다. Repository에선 단순한 CRUD작업이아니기때문에 @Query어노테이션을 이용해서 쿼리문을 작성해주었다.
public interface CompanyCalenderRepository extends JpaRepository<CompanyCalender, Long> {
@Query(value = "SELECT c.schedule, DATE_FORMAT(c.date, '%d') AS Day FROM companyCalender c WHERE YEAR(c.date) = :year AND MONTH(c.date) = :month ORDER BY c.date", nativeQuery = true)
List<Object[]> findScheduleByYearAndMonth(int year, int month);
}
원래 OracleDB를 써오다 MariaDB를 써보니 DATE_FORMAT같은 부분은 원래 TO_CHAR 혹은 TO_DATE를 이용해서 짤라냈었는데, 이런 방면에선 더 편한것같다.
처음에는 어떻게든 Map<String, List<String>>으로 선언해주고싶어서 시도해봤으나 해당 인터페이스에서 리턴할수 없엇기에 서비스단에서 바꿔주기로 했다.
public Map<String, List<String>> getCompanyCalenderList(int year, int month) {
List<Object[]> scheduleLists = companyCalenderRepository.findScheduleByYearAndMonth(year, month);
return scheduleLists.stream()
.collect(Collectors.groupingBy(
scheduleList -> (String) scheduleList[1], // Day
Collectors.mapping(scheduleList -> (String) scheduleList[0],
Collectors.toList()
)));
}
사실 아래에서 return하는 부분은 제대로 이해하고 있진않다. 아직 strean, 람다식이나 Collectors 클래스에 대한 지식이 부족해서 인공지능의 도움을 받았다..
위와같이 진행하고다니 JSON을 파싱하거나 이용하는 것은 이전에도 해봐서 손쉽게 진행해 나갔다.
부서일정도 위와같은 방식으로 진행해나갔다. 다만 차이가있다면 부서같은 경우에는 로그인할때 받아놓은 department속성을 불러와서 쿼리문에서 조건이하나가 추가된채로 만들어졋다.
@Query(value = "SELECT c.schedule, DATE_FORMAT(c.date, '%d') AS Day FROM teamcalender c WHERE YEAR(c.date) = :year AND MONTH(c.date) = :month AND team =:department ORDER BY c.date", nativeQuery = true)
List<Object[]> findScheduleByYearAndMonth(int year, int month, String department);
그리고 서비스에선 CompanyCalender와 마찬가지의 방식을 통해 넘겨주었다.
다만 진행하다보니 문제가 생겼는데
처음엔 이사진의 January, 즉 영문으로 날짜표기하는 부분이 select태그에서 날짜를 바꾸거나 부서일정 혹은 회사일정을 누르면 사라지는 문제가있어서 Js파일을 대대적으로 손봣었느데 해당 문제를 해결하고 나니
오른쪽 사이드바의 날짜가 +1되서 나오게됫었다.
(지금은 또 갑자기 왼쪽 영문 월표기가 +1 되어서 나온다)
사실 아까 낮에는 001, 011, 021이런식으로 월의 정보가 나오기도했엇고 어디선가 문제가 나온것같은데 한참 찾았으나 정확히 문제부분을 파악 못해서 아마 내일은 js파일 한줄한줄에 로그를 찍는걸로 하루를 시작할것같다..
JavaScript 너무 복잡하다 ㅜㅜ
JSP+Java Servlet Version: https://github.com/Park-GiJun/personnelManagement
GitHub - Park-GiJun/personnelManagement
Contribute to Park-GiJun/personnelManagement development by creating an account on GitHub.
github.com
Spring Version : https://github.com/Park-GiJun/PracitceSpringJpa
'Study > Spring' 카테고리의 다른 글
Spring Security + JWT #3 (0) | 2024.01.07 |
---|---|
Spring Security + JWT #2 (0) | 2024.01.07 |
Spring Security + JWT Token #1 (0) | 2024.01.07 |
Spring 2일차 Java Servlet+JSP프로젝트를 스프링으로옮기기 (0) | 2024.01.03 |
Spring 1일차 연습해보기 (0) | 2024.01.02 |