
🔹프로젝트 기간
2024.10.07 - 2024.11.05 (4주)
🔹프로젝트 주제
공공데이터 활용 여행지 추천 및 여행 기록 공유 커뮤니티 서비스
🔹담당 역할
조장
PPT 담당
로그인/회원가입
아이디/비밀번호 찾기, 프로필 편집
마이페이지
FAQ페이지
🔹사용 기술 환경
Javascript, jsp, Java, Ajax, MySql, Tomcat, node.js, spring MVC, DBeaver, Mybatis
💭프로젝트에서 배운 점
1. 공공데이터 요청과 API 활용
공공데이터를 활용하기 위해 요청 파라미터와 응답 형식의 중요성을 깨달았습니다.
API 요청 시 파라미터를 구성하는 과정에서 개발 문서를 꼼꼼히 읽고
API를 통해 데이터를 받아오려면 제공되는 요청 파라미터를 정확히 이해하고 적절히 작성해야 합니다.
응답 데이터가 JSON이나 XML 등 어떤 형식으로 반환되는지를 이해하고, 처리하는 코드를 작성해야 데이터를 원하는 형태로 활용할 수 있음을 알게 되었습니다.
2. 소셜 로그인과 리다이렉트 경로의 중요성
소셜 로그인 기능을 구현하면서 리다이렉트 경로가 얼마나 중요한지 깨달았습니다.
소셜 로그인은 사용자 인증 과정에서 Google, Kakao, Naver 등을 거쳐야 하므로, 인증이 완료된 후 리다이렉트 URL로 정확히 돌아와야만 정상적으로 서비스를 제공할 수 있습니다. 만약 리다이렉트 경로가 잘못되거나 누락되면, 인증 결과를 처리하지 못해 로그인/회원가입 서비스를 이용할 수 없습니다.
이 기회로 OAuth2.0 인증 프로세스를 학습하며, 리다이렉트 URL을 설정하는 방법과 인증 후 토큰을 처리하는 방식을 익혔습니다.
덕분에 인증 데이터가 전달되는 흐름과, 클라이언트와 서버 간의 상호작용 과정을 이해하게 되었습니다.
3. DB 설계의 중요성
데이터베이스 설계 단계에서 느낀 점은 DB 설계가 전체 프로젝트의 뼈대가 된다는 것이었습니다.
테이블 구조가 잘못 설계되면 이후 데이터의 저장, 수정, 조회 등에서 문제가 발생하며, 이는 코드를 수정하는 데 많은 시간과 노력을 소모하게 됩니다. 이에 대한 중요성을 알고 각 페이지 별로 필요한 DB설계하며 테이블 간의 조인 방식도 미리 논의하였습니다.
특히 회원만이 이용할 수 있는 기능들이 많다보니 유연하고 확장 가능한 데이터베이스 설계의 중요성을 실감하였습니다.
탄탄히 설계 단계했다고 생각했지만 서비스를 구현하면서 부족한 부분이 생겨 DB설계는 충분한 고민이 필요하다는 교훈을 얻었습니다.
4. Ajax 기능의 장점과 활용
Ajax를 활용하면서 비동기 통신의 장점을 체감했습니다.
기존 동기 방식에서는 페이지를 새로고침해야 데이터를 갱신할 수 있었지만, Ajax를 사용하면 사용자가 작업 중에도 실시간으로 데이터를 서버와 주고받을 수 있다는 점이 큰 장점이었습니다. 특히, 빠르고 매끄러운 사용자 경험(UX)을 제공하는 데 Ajax가 핵심적인 역할을 한다는 것을 알게 되었습니다.
로그인, 회원가입 시 실시간으로 데이터를 필터링해 표시하는 기능을 개발했습니다.
공공데이터 활용부터 소셜 로그인, DB 설계, Ajax 기능까지 다양한 기술을 다루면서 기술적으로 한 단계 성장할 수 있었습니다.
무엇보다 1차 프로젝트에 아쉬웠던 점들을 되새기며,
이 코드와 과정이 왜 필요한지와 실제로 어떤 방식으로 활용되는지를 깊이 고민하고 학습했던 점이 가장 큰 성과라고 생각합니다. 😳
🤝프로젝트 Review
2차 프로젝트에서 조장 역할을 맡으며, 심리적으로 많은 부담감이 있었습니다.
특히, 맡은 페이지들이 쉽지 않아서 더 큰 고민을 안게 되었고, 팀 내 나침반 역할을 잘 할 수 있을지에 대한 걱정도 컸습니다.
팀원들에게 신뢰를 주고 방향을 제시하는 것이 중요한 역할인데,
제 실력이 부족하다 보니 그 부분에 대한 불안감이 지속적으로 있었습니다.
팀원들에게 도움이 되기 위해 했던 노력
프로젝트에서 제가 팀원들에게 도움을 줄 수 있는 부분은 크게 두 가지였습니다.
첫째, 최대한 많은 자료조사와 선행 학습을 통해 팀원들에게 필요한 지식과 자료를 전달하는 역할이었습니다.
둘째, 프로젝트의 기간 내에 잘 마무리될 수 있도록 시간과 일정을 관리하는 것이었습니다.
매 회의 전에 1시간씩 시간을 내어 자료를 조사하고 부족한 개발 지식을 보충했습니다. 이를 바탕으로 노션을 통해 모든 자료를 공유하고, 일정과 개발 현황을 실시간으로 업데이트하여 팀원들이 효율적으로 작업할 수 있도록 지원했습니다. 팀원들의 의견과 진행 상황을 공유하면서 효율적인 협업을 끌어내려 노력했습니다.
조장 역할에서의 아쉬움과 성장
그럼에도 불구하고 조장을 하면서 부족한 점이 많았다고 느꼈습니다.
팀원들이 어려워하는 부분을 쉽게 설명해줄 만큼 개발 실력이 뛰어나지 않았고, 각자의 상황에 맞춰 팀원들에게 정확히 도움을 주는 데 어려움을 겪었습니다. 특히, 잘 참여하지 않는 팀원에게 믿고 기다려주는 것이 맞다고 생각했지만, 때로는 냉철하게 대처하지 못해 한 페이지가 아예 구멍이 날 뻔한 상황도 있었습니다.
이러한 경험을 통해 리더십에 대한 깊은 고민이 필요함을 깨달았습니다.
계획을 세울 때보다 실제 상황에서는 유연하게 대처할 필요성과 팀원들의 성격과 능력에 맞춰 역할 분배를 잘하는 것이 얼마나 중요한지 알게 되었습니다. 처음 계획한 대로 완벽하게 진행되지 않았지만,
결국 프로젝트를 완성할 수 있었던 것은 팀워크와 각자 역할에 대한 책임감 덕분이었습니다.
후회와 회의감, 그리고 1위 수상
프로젝트가 끝난 후, 조장으로서 어떻게 해야 했을지에 대한 회의감과 후회가 남았습니다.
"조장 역할을 잘 했던 걸까?"라는 질문을 계속 던지며 많은 고민을 했습니다.
하지만 팀원들과 함께 해낸 성과와 프로젝트 결과물이 주는 만족감이 크고, 특히 1위라는 좋은 평가를 받았을 때,
그 모든 어려움이 값진 경험으로 느껴졌습니다. 그 과정에서 소통과 문제 해결 능력이 얼마나 중요한지 깊이 깨닫게 되었습니다.
배운 점과 성장
이번 프로젝트를 통해 조장 역할의 중요성과 리더십에 대해 많은 것을 배웠습니다.
단순히 실력뿐만 아니라, 팀원들과의 소통, 동기 부여, 문제 해결이 얼마나 중요한지를 실감했습니다.
개발 지식뿐만 아니라 조직 내 역할을 잘 수행하는 능력도 중요한 역량이 되며, 이를 통해 성장한 자신을 느낄 수 있었습니다.
이 경험을 바탕으로 앞으로는 더 나은 리더로서 팀원들을 이끌어 나가고, 팀 내에서 개발 능력뿐만 아니라 협업 능력을 키워 나갈 것입니다. 앞으로의 프로젝트에서는 이번 경험을 바탕으로 더 효율적이고 체계적인 관리를 할 수 있도록 노력할 것입니다.
두 번째 프로젝트는 어려움과 도전이 가득했지만, 그만큼 성장의 기회가 되었습니다.
제가 맡았던 조장 역할을 통해 많은 것을 배우고, 실수와 아쉬움 속에서도 프로젝트를 완성한 경험은 제게 큰 자산이 될 것입니다.
이 경험을 바탕으로 앞으로는 더 나은 리더가 되어, 팀원들과 함께 성장하는 개발자가 되겠습니다. 🐣🐥
🟡PPT 일부 발췌














✔ 시연 영상
✅주요 소스 코드
🚩m_memberController
m_membercontroller 주요 코드
// 로그인 처리 요청
@PostMapping("/loginProcess")
public String loginProcess(String m_email, String m_password,
HttpServletRequest request, Model model) {
// 로그로 로그인 시도 정보 출력
System.out.println("로그인 요청이 들어왔습니다: " + m_email);
// 로그인 실패시 보여줄 뷰 이름을 미리 설정
String viewName = "Member/login";
// 이메일과 비밀번호를 사용해 로그인 시도
M_MemberVO vo = m_memberServiceImpl.login(m_email, m_password);
// 로그인 성공 여부 판단 (vo가 null이 아닐 경우 성공)
if (vo != null) {
if("deleted".equals(vo.getM_status())) {
//탈퇴한 회원인 경우 로그인 실패 처리
model.addAttribute("msg_del", "탈퇴한 회원입니다. 다시 가입해주세요.");
}else {
//탈퇴하지 않은 회원인 경우 로그인 성공 처리
// 세션 객체를 가져와서 세션에 회원 정보를 저장
HttpSession session = request.getSession();
session.setAttribute("member", vo);
// 세션에 회원 정보가 제대로 저장되었는지 확인하기 위한 로그 추가
M_MemberVO sessionMember = (M_MemberVO) session.getAttribute("member");
if (sessionMember != null) {
System.out.println("세션에 저장된 회원 정보: " + sessionMember);
System.out.println("닉네임: " + sessionMember.getM_nickname());
System.out.println("m_idx: " + sessionMember.getM_idx());
System.out.println("프로필 이미지 경로: " + sessionMember.getM_profile()); // 프로필 이미지 확인
} else {
System.out.println("세션에 저장된 회원 정보가 없습니다.");
}
// 로그인 성공 시 메인 페이지로 리다이렉트
viewName = "redirect:/HomePage/mainpage";
}
}else {
// 로그인 실패 시 메시지와 함께 다시 로그인 페이지로 이동
model.addAttribute("msg", "아이디나 비밀번호가 일치하지 않습니다.");
}
// 로그인 결과에 따라 뷰 반환
return viewName;
}
- 로그인을 하면 세선에 회원정보를 저장하여 사용하도록 로직 구성
🚩MypageController
Mypage Controller 주요 코드
@Autowired
private MypageService mypageService;
@GetMapping("/myPageMain")
public String showMypage(HttpSession session, Model model) {
// 세션에서 M_MemberVO 객체 가져오기
M_MemberVO member = (M_MemberVO) session.getAttribute("member");
if (member == null) {
System.out.println("로그인된 사용자가 없습니다.");
return "redirect:/login"; // 세션에 사용자가 없으면 로그인 페이지로 리다이렉트
}
Integer m_idx = member.getM_idx(); // M_MemberVO 객체에서 m_idx 가져오기
System.out.println("로그인된 사용자 m_idx: " + m_idx);
//저장된 게시글 마이페이지 홈에 리스트 가져오기
List<MypageVO>savedPostList = mypageService.getSavedPostListByMidx(m_idx);
model.addAttribute("savedPostList", savedPostList);
//핫플레이스 리스트 가져오기
List<MypageVO> hotplaceList = mypageService.getRandomHotplaceList();
model.addAttribute("hotplaceList", hotplaceList);
//저장된 저장목록 홈에 리스트 가져오기
List<MypageVO>savedList = mypageService.getSavedListByMidx(m_idx);
model.addAttribute("savedList", savedList);
// 다가오는 여행 중 최신 일정 한 개만 불러오기
MypageSchedVO latestUpcomingTrip = mypageService.getLatestUpcomingTripByMidx(m_idx);
if(latestUpcomingTrip != null && latestUpcomingTrip.getPeriod_start() !=null) {
LocalDate today = LocalDate.now();
LocalDate periodStart = latestUpcomingTrip.getPeriod_start().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
long daysRemaining = ChronoUnit.DAYS.between(today, periodStart);
latestUpcomingTrip.setDaysRemaining(daysRemaining > 0 ? "D-" + daysRemaining : "오늘");
}
model.addAttribute("latestUpcomingTrip", latestUpcomingTrip);
System.out.println("Model에 전달된 가장 가까운 다가오는 일정: " + latestUpcomingTrip);
// 지난 여행 중 최신 일정 한 개만 불러오기
MypageSchedVO latestPastTrip = mypageService.getLatestPastTrip(m_idx); // 최신의 지난 일정 한 개만 불러오기
model.addAttribute("latestPastTrip", latestPastTrip); // 모델에 추가
System.out.println("Model에 전달된 최신 지난 일정: " + latestPastTrip);
return "MyPage/myPageMain";
}
- 마이페이지 홈에서 나의 활동로그를 출력하기 위해 m_idx값으로 리스트 가져오기
🚩 M_MemberService
public interface M_MemberService {
int insertM_Member(M_MemberVO memberVO);
M_MemberVO login(String m_email, String m_password);
int checkId(String m_email);
int checkNickname(String m_nickname);
M_MemberVO findByEmail(String email);
M_MemberVO updateMember(M_MemberVO vo);
int cancel(int m_idx);
boolean isValidPassword(String m_password);
M_MemberVO updateProfileImage(M_MemberVO vo);
String findIdByRegistrationAndNickname(String registrationType, String nickname);
boolean updatePassword(String m_email, String newPassword);
}
🚩 MypageService
public interface MypageService {
List<MypageVO> getRandomHotplaceList();
List<MypageVO> getSavedList(int m_idx);
List<MypageVO> getSavedPostList(int m_idx);
List<MypageVO> getSavedPostListByMidx(Integer m_idx);
List<MypageVO> getSavedListByMidx(Integer m_idx);
List<MypageSchedVO> getUpcomingTrips(int m_idx);
List<MypageSchedVO> getPastTrips(int m_idx);
MypageSchedVO getLatestPastTrip(Integer m_idx);
MypageSchedVO getLatestUpcomingTripByMidx(Integer m_idx);
}
'Project > javachip' 카테고리의 다른 글
[Portfolio] 커뮤니티 기반 크라우드 펀딩 사이트 (3) | 2024.11.25 |
---|---|
[2nd Project] 2차 프로젝트를 끝내며, 당근과 채찍 (+ 결과) (9) | 2024.11.07 |
[2nd Project] 자바스크립트와 JSP로 챗봇 만들기 (5) | 2024.10.26 |
[2nd Project] 여행 일정 마이페이지에 불러오기 (JSP, STS, Mysql) (5) | 2024.10.23 |
[2nd Project] 아이디, 비밀번호 찾기/재설정(이메일 인증, JSP, STS) (4) | 2024.10.22 |