오늘은 개발 중 필요에 의해 추가한 기능에 대해 포스팅하려고 한다.
팀원과 회의 중 주차장 전화번호로 주차장을 찾아 정보를 리턴해주는 기능도 추가했으면 좋겠다는 의견이 나왔다.
이미 구현했던 코드를 이용하면 쉽게 만들 수 있는 기능이라 판단되어 기능 추가를 하기로 했다.
간단한 과정이지만 그 과정을 남겨두려고 한다.
DB 데이터 변경
우선 DB에는 전화번호가 "032-000-0000" 형태로 저장되어있다. 하지만 사용자로부터 입력받는 전화번호 정보는
"0320000000" 으로 '-' 가 없어 DB에서 찾기가 힘들다.
나는 이 문제를 자바의 replace() 함수를 사용하여 해결할 생각이다.
전화번호가 저장되는 부분에 replace("-","") 를 붙여주었다. 이렇게 되면 전화번호 컬럼 내부의 '-' 가 전부 사라진 상태로 저장된다.
DB에 확실하게 삭제되어 저장되었다. 이제 기능을 수행할 Repository 와 Service 클래스에 코드를 작성해보자.
Repository, Service 클래스에 추가
함수 이름은 전화번호로 주차자을 찾는다고 해서 findByTel 로 지정했다.
ParkRepository.findByTel()
List<Park> findByTel(String telnum); //findByTel : 전화번호로 주차장 검색
우선 인터페이스인 ParkRepository 에 기능을 작성했다.
JpaParkRepository.findByTel()
@Override
public List<Park> findByTel(String telnum) {
//입력받은 전화번호가 포함된 주차장 검색
List<Park> parkList = em.createQuery("SELECT p FROM Park p WHERE p.phoneNumber LIKE ?1")
.setParameter(1, telnum+'%')
.getResultList();
return parkList; //받은 주차장 리스트 리턴
}
그리고 구현체인 JpaParkRepository 에 함수가 수행할 동작을 작성했다.
JPQL문을 통해, 입력받은 전화번호(telnum) 로 시작하는 전화번호를 가진 주차장이 DB에 있다면 그 주차장 정보를 받아 리스트 형태로 리턴하게 했다.
ParkServiceImpl.java
public List<Park> searchTel(String telnum) { return parkingRepository.findByTel(telnum); }
findByTel 함수를 사용할 서비스 이름을 searchTel로 지정했다.
사실 searchTel 이라는 함수명이 잘 어울리지 않는 느낌도 들었지만, 생각한 이름 중엔 제일 나았다.
은근 생각보다 골치아픈 부분이 이름 정하기 인 것 같다. 다른 사람이 만든 것들을 종종 찾아보며 어떤 식으로 이름을 짓는지 공부해야할 듯 하다.
자 이제 컨트롤러만 만들어주면 기능 구현이 끝난다. 바로 만들어보겠다.
Controller 작성
ParkDataTelSearchServlet.java
@WebServlet(name = "parkDataTelSerachSevlet", urlPatterns = "/lots/tel")
public class ParkDataTelSearchServlet extends HttpServlet {
@Autowired
private ParkServiceImpl parkingService;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ObjectMapper objectMapper = new ObjectMapper();
String num = request.getParameter("num");
System.out.println("num = " + num);
List<Park> parkList = parkingService.searchTel(num);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
List<String> parkJsonList = new ArrayList<>();
//objectMapper 로 'park(자바객체형태)' -> 'Json 형태'-> 'Json 구문의 String 형태' 순으로 변환하여 String 변수에 저장
//그리고 String List 인 parkJsonList 에 값 저장
for (Park park : parkList) {
String parkJson = objectMapper.writeValueAsString(park);
parkJsonList.add(parkJson);
}
//저장한 parkJsonList 를 클라이언트에게 전달
out.print(parkJsonList);
out.flush();
}
}
URL패턴은 "/lots/tel" / 파라미터는 "num" 으로 지정해주었다.
클라이언트에서 지정한 URL에 파라미터 값을 넣어 Request 를 보내면 파라미터의 값을 받아 searchTel 함수를 수행한다.
그리고 받아온 리스트를 Jaskson 라이브러리의 ObjectMapper 로 Json형태로 변경하고
콘텐츠타입을 application/json, 인코딩 타입을 UTF-8 로 지정하여 클라이언트에게 보낸다.
이렇게 하면 클라이언트에선 응답받은 주차장 정보를 사용할 수 있게 된다.
마지막으로 테스트 결과를 확인하고 포스팅을 마치도록 하겠다.
Test 결과
나는 num 파라미터에 '032' 라는 값을 넣어주었고, 전화번호가 '032' 로 시작하는 주차장 정보들이 전부 출력되어 성공적으로 기능이 구현되었다.
오늘 이렇게 새로운 기능을 추가하는 과정을 보여드렸는데, 긴 글 읽어주셔서 감사합니다!
아 그리고 서블릿으로 컨트롤러를 개발하고 있어서 컨트롤러가 기능당 하나씩 만들어지고 있는데, 이 부분은 나중에 스프링 MVC 를 공부하고 적용하는 과정에서 축소 시킬 예정입니다.
'프로젝트' 카테고리의 다른 글
[SpringBoot] [어따세워] Amazon S3와 @RestController를 이용해 리뷰 기능 구현하기(2) - Review Upload 기능 개발 (2) | 2022.01.03 |
---|---|
[SpringBoot] [어따세워] Servlet, JPA, MySQL 이용해서 회원가입 서비스 만들기!(2) (2) | 2021.12.06 |
[SpringBoot] [어따세워] Servlet, JPA, MySQL 이용해서 회원가입 서비스 만들기!(1) (0) | 2021.12.05 |
[어따세워] 메타버스 스터디룸 (Gather town) (0) | 2021.11.30 |
[SpringBoot] [어따세워] 첫 백엔드 프로젝트 기획 (2) | 2021.11.29 |