[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #8 - 투표기능 개발하기

2025. 7. 21. 01:47·팀 프로젝트/[2025][GDG]홍대 맛집 아카이빙 프로젝트

오늘 2시에 일어나서 방정리하고 놀고 설거지하고 했더니 9시가 됐다.. 나 진짜 게으르게 살았다. 그래도 주말이잖아

내일은 10시에 성수동에서 ICPC 알고리즘 캠프가 있어서 C++를 배워놔야하는데.. 우선 자바부터

내일 코어타임이라 코어타임 전에 내가 어디까지했나와 문의사항 몇 개 정리해놔야할듯

 

어제 짜놓은 플로우를 보면서 짜면 될듯

마치플리들으면서빡집중합시다사실오늘추천곡은달의하루3곡이에요

 

테스트는 DB없이 내가 임의로 값을 설정해서 진행하기로

 

기능만들어야할거

- 투표하기

- 투표 결과보기

- 월별 투표목록 조회

- 내 투표 조회

- 관리자 조회


1. 월별 투표 후보 목록 조회

 

 

어제 짜놓은 플로우

미리 짜놓으니까 좋네

 

궁금한게 외부인 계정이 투표기능에 조회하려면 어떻게 해야하지?

우선 내 생각으로는 투표현황까지는 열람이 가능한데 투표하기 버튼만 막아놓는게 좋을 것 같다.

그럼 우선은 투표현황을 가져오는거니까 권한 상관없이 불러오기!

 

아직 DB가 없어서 대충 DTO 정도만 만들었다. 사실 DB설계하면 DTO도 수정해야하는데 우선은 그냥 짬

/**
 * 매장정보를 불러오는 DTO입니다.
 *
 * @author dx2d2y
 *
 * @param identifier        매장 식별자
 * @param location          매장 위치. 지도에 표시될 정보로 위도-경도 순으로 리스트에 들어갑니다.
 * @param storeName         매장 이름
 * @param storeInfoOneLine  매장 한줄평
 * @param storeMenu         매장 메뉴
 * @param votedAmount       투표 받은 횟수
 */
package com.hongchelin.dto;

import lombok.Builder;
import lombok.Getter;

import java.util.ArrayList;

@Builder
@Getter
public class StoreDTO {
    String identifier;
    ArrayList<String> location;
    String storeName;
    String storeInfoOneLine;
    ArrayList<String> storeMenu;
    Integer votedAmount;
}

대충 몇 개정도 더 생각하고, 나중에 필요하겠다싶은 기능도 넣어서 DTO를 구성했다.

언제나 수정가능

라고하고 10분만에 수정함ㅜ

 

package com.hongchelin.controller.vote;

import com.hongchelin.Service.Vote.AccessVoteByMonthService;
import com.hongchelin.dto.user.ResponseDTO;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/votes")
public class AccessVoteByMonthController {
    private final AccessVoteByMonthService accessVoteByMonthService;
    public AccessVoteByMonthController(AccessVoteByMonthService accessVoteByMonthService) {
        this.accessVoteByMonthService = accessVoteByMonthService;
    }

    @GetMapping("/candidates")
    public ResponseEntity<ResponseDTO> AccessVoteByMonth(@RequestParam String yearMonth) {
        if (yearMonth != null) {
            Integer year = Integer.parseInt(yearMonth.split("-")[0]);
            Integer month = Integer.parseInt(yearMonth.split("-")[1]);
            return accessVoteByMonthService.AccessVoteByMonth(year, month);
        } else {
            ResponseDTO responseDTO = ResponseDTO.builder()
                    .status(500)
                    .message("Internal Server Error")
                    .build();
            return ResponseEntity
                    .status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(responseDTO);
        }
    }
}

컨트롤러

여기서 /votes/candidates?2025-07로 접근했더니 오류는 안나는데 localhost:8080/login으로 이동했다.

엥? 싶어서 살펴보니 OAuth를 다루기 위해 Security Config 설정을 했는데 그게 문제라는 거

 

.authorizeHttpRequests(auth -> auth
                        .requestMatchers("/", "/api/login/**", "/votes/**").permitAll()
                        .anyRequest().authenticated()
                )
.oauth2Login(oauth2 -> oauth2
                        .defaultSuccessUrl("/login/success", true)

                )

우선 윗코드

위에서 들어가지 않은 url들은 모두 인증이 필요한 상태. 즉, 저기에 없는 url로 접근하면 로그인 창으로 강제로 이동시킨다. 쓸데없이 친절하네

 

그다음 아래에서는 로그인이 완료되면 적혀진 url로 이동시킨다.

문제는 위에 코드에서 설정을 해도 인증되지 않은 url 요청으로 인식해서 /login 으로 강제리다이렉트 시킨다나 뭐라나.. 왜 그런진 잘 모르겠다. GPT에게 물어봤더니 문제삼은 부분도 바로 저거

 

그래서 해답이라고 준 것이 있긴하다.

                .oauth2Login(AbstractHttpConfigurer::disable)

약간 미봉책이긴한데.. 이러면 OAuth를 꺼버리게된다.

당연히 로그인도 안됨. 열심히 만들었는데 로그인이 안돼서 마음이 아프다. 그래서 취소

 

근데 취소하고나니까 잘되네?

뭐지?

 

암튼 작동은 잘된다,

랍스타

윤마치

를사랑

하세요

 

프론트에서는 저 userinfo만 받아서 쓰면 된다.


2. 투표하기

역시 DB가 없는이상 크게 할 건 없고 그냥 요청 받아서 DB에서 해당 가게의 좋아요 수에 +1하면 된다.

중복투표방지차원에서는 DB에 식별자를 저장해두면 좋을듯.

 

그리고 투표기능은 재학생만 가능한 기능인데 이 때 JWT 토큰을 조회해야한다.

이 기능도 구현해야함. 드디어 JWT토큰을 쓰는구나. 그러면 사실 JWT 토큰에 식별자가 있어서 헤더만 읽으면 끝. 인자로 받을 것은 무엇을 투표했는지만 인자로 받으면 됨

 

이것도 성공.

테스트한다고 주석처리만 계속하느라 눈 빠지는줄..

늘 보지만 ResponseDTO가 반환된 것을 보면 참 신기하다.

투표가게에 storeIdentifier (가게식별자) / 투표수가 votedAmount (투표수). 저 두 개를 가지고 DB에 접근해서 가게를 알아내 투표수 +1을 해야한다. 아직 DB가 없어서 코드공개는 좀 무리

 

그래도 JWT토큰을 불러와서 권한확인 코드까지는 짰다.

권한확인 후 메시지는 테스트하느라 주석처리를 이리저리하다가 급하게 짜서 그냥 저런걸로 만족


3. 투표 결과보기

이것도 그냥 쿼리파라미터로 온 연도/달을 받아서 DB에서 가져오면 된다. 세상간단

 

package com.hongchelin.Service.Vote;

import com.hongchelin.dto.user.ResponseDTO;
import org.springframework.http.ResponseEntity;

public class AccessSelectedStoreService {
    public ResponseEntity<ResponseDTO> accessSelectedSotreService(String yearmonth) {
        if (yearmonth != null) {
            return null; //정보 불러오기
        } else {
            return null; //오류
        }
    }
}

DB설계도 안해놔서 이정도로 끝

뼈대만 세운다고 생각하자


4. 내 투표조회

이거는 컨트롤러와 서비스만 연결시켜놨다.

투표하면 DB에 store identifier - votedIdentifier 이런 형식으로 저장될텐데.. 즉, 가게식별자와 투표한사람의식별자가 DB에 저장되는데, DB를 쭉 순회하면서 내 식별자를 찾아야하긴하는데 그럼 이 서비스가 5년이 됐다고하면 12달마다 투표를 하는데 한 투표마다 10개 정도의 후보가 있으면 내 식별자 찾는데 DB 600개를 순회해야되네저런

userDB에 저장해야하나 나중에 DB설계할 때 협의해야겠다.


5. 관리자 기능

관리자 기능은 JWT토큰에서 조회해야한다. 이거야 뭐 5분이면 짤 것 같은데 내일 합시다.


책을 안읽었네...

암튼 오늘은 이정도로 하면 될 것 같다

추가로 내일 코어타임이고 30일에 발표가 한 번 있으니 그 전에 API 명세서를 한 번 짜야겠다. Swagger를 이용할 예정

 

내일 할 거

- Swagger

- 책 읽기

- 투표기능 좀 다듬기

- DB

'팀 프로젝트 > [2025][GDG]홍대 맛집 아카이빙 프로젝트' 카테고리의 다른 글

[GDG]홍대 맛집 아카이빙 프로젝트 #10 - H2 DB 연결하기  (3) 2025.07.27
[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #9 - 회원가입 기능 개발하기  (1) 2025.07.22
[GDG]홍대 맛집 아카이빙 프로젝트 #7 - 투표기능 기획  (2) 2025.07.20
[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #6.1 - DTO 및 로그인 기능 마무리  (0) 2025.07.19
[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #5 - OAuth 최종점검  (0) 2025.07.18
'팀 프로젝트/[2025][GDG]홍대 맛집 아카이빙 프로젝트' 카테고리의 다른 글
  • [GDG]홍대 맛집 아카이빙 프로젝트 #10 - H2 DB 연결하기
  • [GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #9 - 회원가입 기능 개발하기
  • [GDG]홍대 맛집 아카이빙 프로젝트 #7 - 투표기능 기획
  • [GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #6.1 - DTO 및 로그인 기능 마무리
Radiata
Radiata
개발을 합니다.
  • Radiata
    DDD
    Radiata
  • 전체
    오늘
    어제
    • 분류 전체보기 (211)
      • 신년사 (3)
        • 2025년 (2)
        • 2026년 (1)
      • CS (59)
        • JVM (12)
        • 백엔드 (20)
        • 언어구현 (1)
        • 객체지향 (1)
        • 논리회로 (5)
        • 컴퓨터구조 (9)
        • 데이터베이스 (1)
        • 컴퓨터 네트워크 (10)
      • 언어공부 (64)
        • Java | Kotlin (48)
        • JavaScript | TypeScript (9)
        • C | C++ (6)
      • 개인 프로젝트 (11)
        • [2025] Happy2SendingMails (3)
        • [2026] 골든리포트! (8)
        • [2026] 순수자바로 개발하기 (0)
        • 기타 이것저것 (0)
      • 팀 프로젝트 (29)
        • [2025][GDG]홍대 맛집 아카이빙 프로젝트 (29)
      • 알고리즘 (13)
        • 백준풀이기록 (11)
      • 놀이터 (0)
      • 에러 수정일지 (2)
      • 고찰 (24)
        • CEOS 23기 회고록 (2)
  • 블로그 메뉴

    • CS
    • 언어공부
    • 개인 프로젝트
    • 팀 프로젝트
    • 알고리즘
    • 고찰
    • 신년사
    • 컬러잇 개발블로그
  • 링크

    • 컬러잇 개발블로그
  • 공지사항

  • 인기 글

  • 태그

    144
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Radiata
[GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #8 - 투표기능 개발하기
상단으로

티스토리툴바