본문 바로가기
반응형

Project/소경관72

[소경관] : 로직에서 if문 지양하기 도전.. 로직을 짜면서 if문을 남발하다 보니 알아보기 어려운 코드가 되가고 수정하기가 어려워지고 있다. 일단, 로직 자체가 길어지는 문제도 있는 것 같아 줄여보고자 여러 방법을 찾아봤다. 그 중에서 제일 간단한 따로 메소드를 만들어 빼보는 코드를 먼저 구현했다. 사실 이게 맞는지 모르겠지만 일단 뭐라도 해보자는 생각에 함수로 빼는 것을 했지만 다시 enum을 사용해 보는 것을 고려하고 있다. 우선 코드를 적어본다. // 파싱 데이터 뺴기 List list = new ArrayList(); // list에 JSON -> String으로 타입 변경해서 담기 for(int i=0 ; i 2022. 6. 18.
[소경관] : 프로젝트 발표와 실패 오늘 프로젝트 발표가 있었다. 마감은 다음주인데 미리 완성한 사람은 먼저 발표하고 통과를 하거나 매를 맞거나 할 수 있는 기회가 있어서 다 완성한 김에 발표를 했는데 결론을 먼저 말하면 실패했다. 처음에 발표 할 때에는 alert를 따로 설정해 주지 않아서 유저 친화적이지 않다는 이유로 빠꾸당해서 오후까지 싹 프로젝트 갈아 엎어서 만들었는데 두 번째 발표 때는 하필.. 문자 API를 보내는 곳에 요금이 다 떨어져서 오류를 터트렸다. 따로 오류 잡아주는 코드가 없어서 실패했고 지금은 restController로 바꾸면서 catch로 오류를 다 잡아준 상태이다. 다음주 월요일에 발표하고 마무리를 하게 될 것 같다. 2022. 6. 17.
[소경관] : Spring Boot, Gradle jar 배포하기 오늘은 프로젝트 마무리를 하면서 배포까지 진행했다. 중간에 막히는 부분이 있었는데 아직 코드를 다 정리하지 못 해서 적을 수 없다. 배포하는 방법은 찾아보니 Git을 클론해서 gradle를 빌드해서 사용하는 방법이 보통인 것 같은데 일단 나는 인텔리제이에서 jar로 빌드해서 서버에 직접 넣어 사용했다. 아직 몇 가지 오류를 못 잡았지만, 빨리 해결해서 가능하면 내일 마무리할 예정이다. 2022. 6. 16.
[소경관] : 카카오 OCR 사용 카카오 OCR을 사용해서 차량 번호판 인식을 구현하는데 성공하긴 했다. 하지만 이게 약간 편법으로 성공한거라서 애매하다. 아직 로직 정리를 하지 않아서 올리지는 못 한다. 일단 깃 허브에 올려두고 마지막 완성 후에 다시 로직 정리를 할 예정이다. 2022. 6. 15.
[소경관] : 인식률 안 좋은 테서렉트 대체 방안을 마련하다. 이미지를 불러와서 차량 번호판을 인식해 해당 차량을 주차 표기해주는 기능에 테서렉트를 사용했는데 인식률이 진짜 너무 안 좋다. 사용을 못 할 정도여서 다른 방안을 찾던 중 카카오 비전 api를 찾았다. https://developers.kakao.com/product/vision Kakao Developers 카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다. developers.kakao.com 역시 카카오에서 미친걸 만들어낸 것 같다. 얼굴 나이 체크부터 별게 다 된다. 이 중에 ocr 기능도 포함이 되어 있는데 한국에서 만든 ocr 기능이다 보니 한글 인식이 좋지 않을까..하는 기대에 개발 문서와 후기를 들여다.. 2022. 6. 13.
[소경관] : try / catch문에서 if문 다루기 try { JSONObject obj = (JSONObject) message.send(params); log.debug("### obj : {}", obj); System.out.println(obj.toString()); JSONObject jsonObject = (JSONObject) obj; log.debug("### jsonObject : {}", (JSONObject) obj); log.debug("### jsonObejct - success_count : {}" , (Long) jsonObject.get("success_count")); // TODO: 2022-06-11 alert로 전송 성공 및 실패 결과 띄워주기 // {"group_id":"dkdlelrkqt","success_coun.. 2022. 6. 11.
[소경관] : 아이디 찾기 및 RestAPI로 문자 사용하기 및 남은 기능 체크 당장 오늘 코딩한 파일만 봐도 수두룩하다. WBS를 100% 구현해야 한다고 해서 안 만들려던 아이디 찾기를 만들었다. 비밀번호 찾기랑 사실 크게 다르지 않다. 비밀번호 찾기할 때 아이디도 입력 받아서 메일하고 아이디랑 같은 user인지 체크하는 로직을 추가할까 했는데 일단은 돌아가게 만들고 나중에 리팩토링할 때 체크해 볼 예정이다. 그거 말고 위기가 하나 왔는데 프로젝트 평가 내용 중 Open API 사용이 있었다. 나는 API를 사용하긴 했는데 JSON 왔다갔다 하지 않았다고 인정이 안 된다고 해서 방문자에게 양식을 보내는 문자 기능을 RestController를 통해 JSON으로 변환해 받고, 주는 것을 하려고 한다. 일단 JSON 형태로 변환해서 문자를 보내주는 것 까지는 성공했고, 이제 뭐 내역.. 2022. 6. 10.
[소경관] : Validator와 공지사항 전파 오늘은 Validator의 헷갈리는 부분을 잡고 공지사항 전파를 구현하면서 적용해 봤다. Validator를 사용하면서 여러 DTO를 한 번에 검증을 받을까 고민을 했지만 따로 하는 게 좋을 것 같다는 답변을 받아 따로 구현해 봤다. 문제는 오늘 공지사항 전파를 구현했는데 email 기준으로 공통 메시지를 보내는 것을 원하고 만들었는데 생각해 보니까 주민을 등록할 때 email을 받지 않았다.. 뭐에 빠졌는지 중요한 것을 깜빡하고 진행해서 오늘 구현한 것들 다 롤백 시켰다. 그리고 email 대신에 문자 api를 사용해서 문자로 전송하는 방안을 고민하고 있다. 일단 문자 api를 제공하는 싸이트에 회원가입하고 key까지 발급 받았다. 문서를 참고해서 내일 문자 기능을 완성시키는 것이 목표다. 2022. 6. 8.
[소경관] : 비밀번호 찾기 구현하기 오늘은 비밀번호 찾기를 구현했다. 딱히 찾는다기 보다는 임시비밀번호 설정해서 이메일로 날려주고, JPA로 유저 정보 읽어와서 업데이트 해주는 게 전부인데 JPA로 처음 해 보다보니 빌더나.. 이메일 라이브러리 사용이나.. 익숙하지 않아 찾아보면서 내 프로젝트에 맞게 변경하여 적용하였다. private String address; private String title; private String message; MailDTO에서 메일 주소와 제목, 내용을 담을 파라미터를 만들어주었다. 이메일을 입력해주세요. 임시 비밀번호 전송 View에서는 이렇게 이메일 값을 입력하고 String userEmail = request.getParameter("address"); MailDTO mailDTO = userSer.. 2022. 6. 7.
[소경관] : 상세보기 구현하기 오늘은 근무일지의 상세보기를 구현해봤다. 저번에 이렇게 저장 목록(컬렉션 명)을 쭉 리스트로 가지고 와서 뿌려주었는데 여기서 각 목록을 클릭하면 상세보기 가능한 페이지로 이동이 되도록 구현했다. 결과를 먼저 보면 아래와 같다. 이렇게 주차 차량과 미주차 차량을 확인할 수 있다. 먼저 컬렉션 네임을 기준으로 코딩해주었다. 찾아보니까 seq나 리스트 id값을 기준으로 가져와서 url이 이쁘게 /1 /2 /3 /4이렇게 남긴 하던데 나는 그냥 컬렉션 명을 기준으로 해주었다. 위 코드는 근무 일지 목록을 뿌려주는 코드인데 a태그를 넣어 href를 먹여주었다. 경로는 컬렉션 명으로 넣어주어 각 탭에 접근이 가능하도록 해주었다. @GetMapping("/detail/{checkCollectionName}") pub.. 2022. 6. 6.
[소경관] : 완료 항목 보기 리팩토링하기 체크를 마치고 완료 항목 리스트를 볼 때 모든 컬렉션 리스트가 아니라 로그인 사용자의 컬렉션 리스트만 보이도록 바꿔주었다. for (String colNm : mongo.getCollectionNames()) { if (colNm == null) { colNm = new String(); } // 컬렉션 명을 _ 기준으로 잘라 String 배열에 담는다. String res[] = colNm.split("_"); // String 배열 중 ID값이 있는 부분과, 세션의 id값을 각 String 변수에 담는다. String result = res[0]; String sessionId = userDTO.getUserId(); // 두 String을 비교하여 같을 시 리스트에 담아준다. if (result.e.. 2022. 6. 5.
[소경관] : 로그인 로직 오류 수정 저번에 구현한 로그인 로직에서 오류를 발견했다. 로그인 했을 때 세션 값을 사용하려고 했는데 여러 아이디로 로그인을 해도 세션 값이 갱신되지 않고 있었다. @GetMapping("/session-info") public String sessionInfo(HttpServletRequest request) { HttpSession session = request.getSession(false); if (session == null) { return "세션이 없습니다."; } session.getAttributeNames().asIterator() .forEachRemaining(name -> log.info("session name = {}, value = {}", name, session.getAttrib.. 2022. 6. 4.
[소경관] : JPA 회원 탈퇴 구현하기 및 회원 탈퇴 Session 처리하기 기능 중 회원에 관한 기능을 이번 휴일 내로 다 구현하기로 해서 천천히 만들고 있다. 이번에는 회원 탈퇴를 구현해야 하는데 일단, JPA를 사용하는 것이 처음이라 여러 예시를 찾아보고 몇 가지를 테스트한 뒤에 구현하고 성공했다. @GetMapping("deleteUser") public String deleteUserPage() { return "myInfo/deleteUser"; } 먼저 탈퇴 페이지를 보여주는 Controller는 간단하게 만들어주었다. 따로 처리해 줄 필요가 없다. 회원 탈퇴 경고나 재확인 등을 처리하지 않고 바로 페이지에 경고 문구와 함께 클릭 시 바로 탈퇴 처리가 되도록 설정해주었다. 때문에 View에서 뭔가 받아 올 필요는 없고 버튼을 눌렀을 때 바로 회원탈퇴 로직을 타도록 해.. 2022. 6. 4.
[소경관] : thymeleaf input에 Session값 가져오기와 input에 Session값을 입력 받아 Controller에 넘기기 마이페이지를 만들면서 동시에 수정도 가능하게 하려고 로그인한 사용자의 정보를 View에 띄워줄 수 있는 코딩을 했다. 직접 아이디 값하고 비교해서 다시 쿼리를 날려 데이터를 가져와 View에 쏴주는 사람도 있는 것 같지만 나는 일단 세션 정보에 담아둔 값을 그대로 View에 쏴주고 그 값에 수정을 한 경우에 그대로 값을 다시 Vo에 담아 가져오는 로직을 구현해봤다. @GetMapping("updateInfo") public String updateInfoPage(Model model) { model.addAttribute("userVo", new UserVo()); return "myInfo/updateInfo"; 먼저 페이지를 보여주는 Controller이다. input 값을 담을 Vo 객체 말고 따로.. 2022. 6. 3.
[소경관] : 회원가입과 로그인 로직 수정하기 회원가입과 로그인 로직을 간단하게 수정했다. 원래 Repository 부분을 JpaRepository를 상속 받아 사용하지 않고 아래와 같이 별도의 클래스를 만들어 Spring Bean을 등록하고 EntityManage 의존성을 주입받아 사용했다. public List findById(String userId) { return em.createQuery("select m from UserEntity m where m.userId = :userId", UserEntity.class) .setParameter("userId", userId) .getResultList(); } public List findByEmail(String userEmail) { return em.createQuery("select .. 2022. 6. 2.
[소경관] : 등록한 차량 초기화 등록한 차량 초기화하는 기능을 구현했다. 사실 등록한 차량을 초기화 하는 것 자체는 어렵지 않다. 컬렉션만 날려주면 되서 MongoDB 라이브러리에서 제공하는 템플릿을 통해 drop만 해주면 된다. mongo.dropCollection("Car"); 코드로 보면 이렇게 한 줄이면 되고, 리턴은 boolean으로 나중에 true, false로 성공, 실패 여부만 따로 체크해 줄 수 있도록 했다. 2022. 5. 31.
[소경관] : ocr 기능 완성과 몇 가지 문제 체크 ocr 기능을 완성하고 깃 허브에 PR 해뒀다. 문제가 몇 가지 있는데 일단 View에서 img를 받아 저장한 다음에 읽는다는 것과 매우 나쁜 ocr 인식률이 문제이다. 전자의 문제는 어떻게 해결을 할 수 있을 것 같은데, 후자의 문제는 진짜 문제다. opencv를 좀 더 공부해서 view에서 받아온 이미지를 따로 읽기 좋게 처리해주고 그 다음에 다시 ocr 인식을 시켜보는 방안을 고민중이다. 아마 이렇게 해야 할 것 같다. 절대 테서렉트의 ocr 기능만으로는 인식률을 올리지 못 할 것 같다. 소스 코드는 아직 정리를 못 해서 못 올리나 깃 허브에서 오늘 날짜로 확인이 가능하다. 2022. 5. 30.
[소경관] : 이미지 인식 처리하기 번호판 인식을 위해 java와 python을 사용해봤다. 파이썬은 이미지 처리까지 다 한 코드들이 많이 떠돌고 있어서 구경 좀 해 봤고, 자바는 테서렉트로 일단 ocr을 하도록 먼저 구현해 봤는데 작은 문제가 있어서 일단 킵 해두었다. 내일 마저 진행해서 일단 ocr먼저 구현하고 그 다음 정확도를 올리기 위해 이미지 프로세싱 처리도 고민해 봐야겠다. 2022. 5. 28.
[소경관] : MongoDB에서 원하는 Collection 명만 가져와서 View에 List로 뿌려주기 저장 목록 View에서는 데이터를 가져와서 뿌려주는 작업만 한다. 나중에 추가하면 클릭해서 상세 보는 것도 추가해야 하지만 일단은 이렇다. public interface ICheckMapper { // 완료 항목 보기 List viewCheck() throws Exception; } 인터페이스에서 정의해주고 오버라이딩해서 사용한다. @Override public List viewCheck() throws Exception { List viewCarDTOList = new LinkedList(); for (String colNm : mongo.getCollectionNames()) { if (colNm == null) { colNm = new String(); } if (colNm.length() > 5).. 2022. 5. 27.
[소경관] : 프로젝트 중간 발표 및 MongoDB Collection 명 중 특정 Collection만 가져오기와 그 이후 진행 예정 오늘 학교에서 프로젝트 중간 발표가 있었다. 지금까지 만들어 둔 기능은 그렇다고 해도 지적받은 부분이 프론트가 별로 이쁘지 않다는 점인데 아직 가져온 부트스트랩 템플릿을 따로 수정하진 않았지만 벌써 답답한 느낌이 든다.. 오늘은 MongoDB에 저장된 Collection을 가져와서 리스트로 보여줘야 하는데 Collection 중 특정 컬렉션 명만 가져와서 보여줘야 했다. 여기서 CHECK_로 시작하는 Collection만 가져와야 해서 길이를 기준으로 끊어서 가져왔다. 어차피 다른 Collection이 없어서 길이로 기준으로 끊었다. 결과적으로는 가져오긴 했지만 클릭했을 때 다시 세부 정보를 보여줘야 하는 로직은 아직 시작하지 않았다. 이번주 마무리 하면서 완성시키고 다음 주 부터는 차량 번호판 이미지 .. 2022. 5. 26.
[소경관] : 등록한 차량 및 주민 정보 수정과 삭제 로직 구현하기 차량 정보와 같이 등록한 주민이나 방문자, 무단 주차자의 정보를 삭제하고 수정할 수 있는 페이지와 로직을 구현했다. @GetMapping("/updateCar") public String updateCarPage(Model model) throws Exception { List carDTOList = iCarListService.getFullCarList(); UpdateCarListVo updateCarListVo = new UpdateCarListVo(); updateCarListVo.setCarDtoList(carDTOList); model.addAttribute("carDTOList", carDTOList); model.addAttribute("updateCarListVo", updateCarLi.. 2022. 5. 25.
반응형