Coder Social home page Coder Social logo

itca's Introduction

웹,앱 프로젝트

링크 : https://dalgom.app

image image

컨셉 : 디저트,커피 위주의 캐치테이블 버전

URL : 20.214.108.168

젠킨스 접속정보 : http://20.214.108.168:9090/

도메인 www.dalgom.app / dalgom.app

https 인증서 추가 설치 요청중...

프로젝트 개발 참여자 및 역할

김민제님 -> 환경구성

권영환님 -> 백엔드 개발

안효진님 -> 백엔드 개발(사진 업로드) 및 앱(flutter,android) 개발

최태형님 -> 백엔드 개발

이진원님 -> 다이어그램 설계

  • 기술스택
  • JAVA JDK 11
  • 스프링부트 2.6.4
  • query DSL 5.0.0 + JPA
  • thymeleaf
  • postgresql Database + docker
  • postman
  • github / sourcetree / github desktop
  • intellij
  • jenkins + docker
  • azure cloud service
  • 가비아 도메인 + https 인증서
  • 톰캣(로컬) + nginx 웹서버(운영)
  • ubuntu 20.04
  • flutter / android app

추천 리스트 우선순위 정렬 알고리즘

  • 추천할 후보 가게들을 여러개를 보유하고 있을 때 어떤 가게를 더 우선순위로 노출시킬지 구현한 사용자 정의 정렬 알고리즘
  • 고려 대상으로는 평균 별점, 리뷰의 개수, 가격, 거리 총 4가지 요소를 각각 사용자에게 추천할 만한 곳에 높은 점수를 부여함
  • 총점이 더 높은 쪽을 최종적으로 우선적으로 노출되게 정렬을 해줌
  • 재사용 가능성을 위해 메서드화 (매개변수 정렬할 가게리스트, 반환값 정렬된 가게리스트)
  • 위에서 고려한 4가지 기준의 상대적 고유한 가치가 다를 수 있으므로
  • 각각의 기준에 상대적 가중치를 부여할 수 있게 상수를 만듬

alt text

-- 간트차트

image

안효진님 DB설계 image

최태형님 SQL 수정

--회원테이블

CREATE TABLE public."member" (
	id int4 NOT NULL GENERATED ALWAYS AS IDENTITY,
	email varchar(200) NOT NULL,
	pwd varchar(200) NOT NULL,
	last_login_time timestamptz NULL DEFAULT now(),
	register_time timestamptz NULL DEFAULT now(),
	update_time timestamptz NULL DEFAULT now(),
	CONSTRAINT member_primary PRIMARY KEY (id),
	CONSTRAINT member_un UNIQUE (email)
);


--게시판 테이블
CREATE TABLE public."forum" (
	id int4 NOT NULL GENERATED ALWAYS AS IDENTITY,
	subject varchar(300) ,
	contents text,
	writer  varchar(200) not NULL,
	create_time timestamptz NULL DEFAULT now(),
	update_time timestamptz NULL DEFAULT now(),
	CONSTRAINT forum_primary PRIMARY KEY (id)
);






-- 2024. 02. 03
create sequence user_userNum_seq
	increment 1
	start 1
	minvalue 1
	maxvalue 9223372036854775807
	cache 1;

create sequence store_storeNum_seq
	increment 1
	start 1
	minvalue 1
	maxvalue 9223372036854775807
	cache 1;

create sequence review_reviewNum_seq
	increment 1
	start 1
	minvalue 1
	maxvalue 9223372036854775807
	cache 1;

create sequence reservation_reservationNum_seq
	increment 1
	start 1
	minvalue 1
	maxvalue 9223372036854775807
	cache 1;

-- 회원테이블
create table public."user"(
	userNum int4 not null default nextval('user_usernum_seq'::regclass),
	userEmail varchar(20) not null unique,
	userPassword varchar(20) not null,
	-- 권한 여부(사용자 0, 가맹점 1)
	auth boolean not null default false,
	constraint user_pk primary key (userNum)
);

create table public."store"(
	storeNum int4 not null default nextval('store_storeNum_seq'::regclass),
	storeName varchar(20) not null,
	storeLocation varchar(20) not null,
	storePhoneNum varchar(20) not null,
	-- 평점 저장여부
	grade varchar(5) not null default 0,
	storeInfo varchar(200),
	-- 텍스트 json 데이터
	images json,
	-- images jsonb, > 바이너리 json 데이터
	createDate date not null,
	modificationDate date,
	userNum int4 not null,
	constraint store_pk primary key (storeNum)
);

create table public."review"(
	reviewNum int4 not null default nextval('review_reviewNum_seq'::regclass),
	writer varchar(20) not null,
	reviewContent varchar(1000),
	-- reviewContent text, > 가변 길이 문자열
	grade varchar(5) not null,
	-- 텍스트 json 데이터
	images json,
	-- images jsonb, > 바이너리 json 데이터
	createDate date not null,
	constraint review_pk primary key (reviewNum)
);

create table public."reservation"(
	reservationNum int4 not null default nextval('reservation_reservationNum_seq'::regclass),
	numberOfPerson int4 not null,
	reservationDate date not null,
	reservationTime time not null,
	reservationUserNum int4 not null,
	constraint reservation_pk primary key (reservationNum)
);

권영환님 초기 아키텍처 설계 image

최태형님 초기 아키텍처 설계 image

이진원님 다이어그램 설계 image

image

image

화면설계 image

image

image image

image

image image 화면설계서_캐치테이블 (3).pptx

  • 젠킨스 셋팅 image

image

  • https 인증서 추가

  • image

  • 웹 도커 셋팅

image

  • nginx 셋팅

    image

  • build.gradle 셋팅 +JPA +QUERY DSL

buildscript {
    ext {
        queryDslVersion = "5.0.0"
    }
}

plugins {
    id 'org.springframework.boot' version '2.6.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.itac.login'
version = '0.3.0'
sourceCompatibility = '11'
archivesBaseName = 'login'

ext['log4j2.version'] = '2.17.1'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation fileTree(dir: './src/main/libs', include: '**/*.jar')

    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
    implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
    implementation 'org.springdoc:springdoc-openapi-ui:1.6.6'


    implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
    implementation 'org.springframework.boot:spring-boot-starter-batch'
    runtimeOnly 'org.postgresql:postgresql'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
    implementation 'com.opencsv:opencsv:5.3'

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'

    implementation 'com.google.code.gson:gson:2.9.0'

    // QueryDSL
    implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
    annotationProcessor(
            "javax.persistence:javax.persistence-api",
            "javax.annotation:javax.annotation-api",
            "com.querydsl:querydsl-apt:${queryDslVersion}:jpa")

    implementation group: 'org.hibernate', name: 'hibernate-spatial', version: '5.5.0.Final'
    implementation 'org.springframework.boot:spring-boot-starter-test'

    implementation group: 'org.apache.poi', name: 'poi', version: '3.17'
    implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '3.17'

    implementation 'com.vladmihalcea:hibernate-types-52:2.19.2'
}

// QueryDSL
sourceSets {
    main {
        java {
            srcDirs = ["$projectDir/src/main/java", "$buildDir/generated"]
        }
    }
}

tasks.named('test') {
    useJUnitPlatform()
}

--프로젝트 관리 방법론

image

프로젝트 관리의 접근 방식은 소프트웨어 개발의 Agile 방식을 기반으로 하며,

이러한 방식으로 교차 기능 팀은 지속적인 공동 작업, 계획 수립, 학습, 개선을 통해 소프트웨어를 신속하게 제공하고 변화에 더욱 유연하게 대응.

Agile 방식의 목적은 프로젝트 완료 단계에서만 모든 이점을 제공할 뿐만 아니라 소프트웨어 개발 프로세스 전체에 걸쳐 이점을 제공.

Agile 관리는 여러 팀을 조율하고, 효과적인 프로세스를 수립하며, 데드라인을 설정하고, Agile 소프트웨어 프로젝트를 성공으로 이끌기 위한 방식

[장점]

여러 프로세스와 도구보다 개인과 상호작용을 중시.

포괄적인 문서화보다 작동하는 소프트웨어를 중시.

계약 협상보다 고객 공동 작업을 중시.

계획을 따르는 것보다 변화에 대한 대응을 중시.

스프린트 단위 : 1주일 image

  • RESTAPI 설계 원칙

    REST의 의미 어떻게 하면 RESTful 하게 자원을 명시하고 주고받는 방법을 API 로써 구현할 수 있을까요? 이를 위해, 저희는 다시 REST 의 의미에 대해 되짚고 갈 필요가 있습니다.

REST(Representational State Transfer) 란 서버와 클라이언트간의 통신방식 중 하나로, 자원의 이름을 구분하고 자원의 상태를 주고받는 통신 방식입니다. 즉, 클라이언트와 서버가 데이터를 주고받는 방식에 대해 정리한 원칙들이 있고, 그 원칙을 기반으로하는 아키텍처 스타일을 REST 라고 하는 것이죠.

REST 는 다음과 같은 2가지 특징을 지닙니다.

자원을 이름을 구분하고, 자원의 상태를 주고받는다.

  1. 명사를 사용하자

첫번째로 명사를 사용해서 자원을 표현합시다. 예를들어 사람들에 대한 정보를 표현하고 싶다면 /people 이라고 표현해서 표현하면 됩니다.

/people

몰론 예외적으로 명사외에 동사를 허용하는 경우가 있는데, 바로 컨트롤러 역할을 하는 경우입니다. 예를들어 /game/play 에 접근하면 게임이 시작되는 URI 가 있다고하면 이것은 게임의 시작여부를 컨

트롤하는 URI 이므로, 이를 동사 play 로 표현할 수 있는 것입니다.

  1. 계층관계를 구분짓기 위해 슬래시 / 를 사용하자

다음으로 자원간에 계층관계를 표현하기 위해서 / (슬래시) 를 사용합시다.

예를들어 상품 중에 3번 상품을 보여주고 싶은경우, /products/3 이렇게 표현할 수 있습니다.

/products/3

  1. URI 마지막에 슬래시를 붙이지말자

말그대로 입니다. URI 마지막에 슬래시를 붙이지맙시다.

/products // 올바른 표현

/products/ // 잘못된 표현

  1. 하이픈 - 기호를 사용해 가독성을 높이자

다음으로 하이폰 (-) 기호를 사용해서 URI 의 가독성을 높일 수 있습니다. 아래처럼 무식하게 일렬로 나열하는 방식은 좋지 않습니다. 또 카멜 케이스를 사용하는 것도 가독성에 있어서 조금 아쉽죠.

맨 마지막에 하이픈 (-) 기호를 붙인 URI 와 비교해보면 훨씬 가독성이 좋아졌습니다.

/profilemanagement // 그냥 일렬로 나열한 방식

/profileManagement // 카멜 케이스를 사용한 방식

/profile-management // 하이픈 기호를 사용한 방식

  1. 언더스코어를 사용하지 말자

또 URI 는 가급적 언더스코어, 즉 밑줄( _ ) 을 사용하지 맙시다. 왜냐하면 일부 브라우저나 화면에서 글꼴에 따라 언더스크어 문자가 가려지거나 숨겨질 수 있기 때문입니다.

따라서 /backend_people 이렇게 표현하기보다는 /people/backend 이렇게 표현하는 것이 더 좋습니다.

/backend_people // X

/people/backend // O

  1. 소문자만을 사용하자

URI 는 또 대문자가 아닌, 소문자만을 사용해야합니다.

/PLAYERS // X

/players. // O

  • postman을 이용한 실제 API 테스트

image

image

itca's People

Contributors

kyh012412 avatar okwow123 avatar irwin-kr avatar anhyojin321 avatar

Watchers

 avatar

itca's Issues

3월 2일 TODOLIST

최태형님.
1)가맹점 수정+이미지 오류 수정
image

png,jpg 이미지 업로드 불가

2)추천알고리즘

권영환님
1)검색화면 마무리
2)예약 화면 (나의 예약)

2.25일 TO DO LIST

강사님
1.스토어 여러개 크롤링

안효진님
1.앱로딩 화면 스플래쉬 추가 개발
2.만든 apk앱을 웹에 업로드

권영환님
1.검색/예약 화면 제작

최태형님
1.가맹점 화면 부분
2.추천 시스템 알고리즘

앱 오류 수정 요청

  1. net:err_cache_miss 오류 발생

  2. 아이콘 splash 이름, 아이콘도 flutter 기본 모양
    -> 달곰 디저트 앱 이름 변경

DB변경사항(Store에 관하여)

storelocation이 varchar(20)인 문제(띄어쓰기 없이 10자가능인상태)
--> varchar(80)으로 수정

평점이 지금 varchar(5)로 되어있는 문제
--> DECIMAL(2,1) 로 변경
-- ex) 0.0~5.0까지 나타낼수 있는 자료형으로 변경
(완료)

맛집 추천 알고리즘 flowchart에 관하여

맛집 추천은 거시적으로 두 가지를 선택할 수 있는데

  1. 현재 유저의 위치를 받아서 주변의 맛집을 추천하는 경우
  2. 유저가 검색을 했을때 검색 결과를 기반으로 연산을 하여서 맛집을 추천하는경우

참조를 위하여 catchtable에 들어가 봤을때
유저의 위치를 입력 또는 감지하지 않고도 전국 기준으로
전체적인 조회를 하는것으로 보이고 크게 두가지 필터가 있는것을 보여집니다.

  1. 지역 , 2특정 기준으로(웨이팅 순, 리뷰순, 가격순, 거리순) 으로 정렬하는 모습을 보여주었습니다.
    이 경우의 그림은 대략
    제목 없음

  2. 유저가 검색을 했을때 검색 결과를 기반으로 연산을 하여서 맛집을 추천하는경우
    는 유저가 검색을 할때마다 별도의 테이블에서 통계를 쌓아서 그 통계를 기반으로
    데이터를 검색해서 출력해야 한다고 생각이 들었습니다.
    제목 없음2

imageRepository

package com.itac.login.entity.image;

import com.itac.login.control.ArticleController;
import com.itac.login.entity.image.image;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

public interface imageRepository extends JpaRepository<image, Long> {
static void saveAll(List images) {
}

@Transactional
@Modifying
@Query(value = "INSERT INTO public.image(originalFileName, realPath, saveFileName) VALUES(:originalFileName, :realPath, :saveFileName)", nativeQuery = true)
int imageInfo(@Param("originalFileName") Optional<String> originalFileName, @Param("realPath") String realPath, @Param("saveFileName") String saveFileName);

}

mypage 못찾는 오류

2024-02-18 10:58:42 TRACE o.h.t.descriptor.sql.BasicExtractor - extracted value ([auth4_4_] : [VARCHAR]) - [general]
2024-02-18 10:58:42 TRACE o.h.t.descriptor.sql.BasicExtractor - extracted value ([useremai5_4_] : [VARCHAR]) - [[email protected]]
2024-02-18 10:58:42 TRACE o.h.t.descriptor.sql.BasicExtractor - extracted value ([userpass6_4_] : [VARCHAR]) - [$2a$10$vdFt65.BuHmbCXp4vjtFp.2.CvaJcyg189UYH69kMQtyByVQ6LlNC]
2024-02-18 10:58:44 ERROR org.thymeleaf.TemplateEngine - [THYMELEAF][http-nio-8080-exec-10] Exception processing template "/mypage/mypage": Error resolving template [/mypage/mypage], template might not exist or might not be accessible by any of the configured Template Resolvers
org.thymeleaf.exceptions.TemplateInputException: Error resolving template [/mypage/mypage], template might not exist or might not be accessible by any of the configured Template Resolvers
at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869)
at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072)
at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:366)
at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:190)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1401)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1145)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1084)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:67)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:102)
at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:93)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:147)
at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:125)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:219)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:213)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.FilterChainPro

2/3~2/4 TODOLIST

강사님 - 화면개발
최태형님 - 가게정보/검색/예약 RESTAPI 개발
안효진님 - 사진 업로드 DB저장 +github+ 본인 pc flutter 셋팅

https 인증서 연결

도메인 셋팅 완료

https 인증서 발급 완료

https 인증서 nginx에 셋팅중...

달곰앱 오픈 관련

달곰앱 클라우드 비용이 월 8만원이 나와서...
일단 서버는 잠시 중단하겠습니다.

혹시 포트폴리오로 웹서버 접속이 필요하다면
댓글로 알려주세요~
잠시 올려드릴게요~

spring boot 에서 세션 정보 가져오는 방법

@SneakyThrows
@Override
@Transactional
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication) throws IOException {
    String memberId = SecurityContextHolder.getContext().getAuthentication().getName();

public boolean check(HttpServletRequest request, Authentication authentication) {
Object principal = authentication.getPrincipal();
System.out.println(request.getRequestURI());
if (!(principal instanceof User)) {

2월 4일 TODOLIST

강사님 -
1.도메인 등록
2.html디자인 템플릿 변경
3.젠킨스 셋팅 및 웹서버 띄우기

권영환님 - 검색 알고리즘 API 제작
최태형님 - 가맹점 등록 API 제작
안효진님 - 이미지 DB등록 및 flutter 셋팅

최태형님 API 제작

1.restapi - json 형태
www.dalgom.com/api/v1/???

기능1.users 테이블에서 auth(일반,가맹점)
에 따라서 마이페이지 데이터를 다르게 보여줘야 함.
일반 -> 내정보
가맹점 -> 내가 가지고 있는 가맹점 정보
기능2.마이페이지 -> 가맹점 -> 등록,수정,삭제,조회

기능3.검색화면 검색했을 때 여러개의 리스트로 나오도록(간단히)
기능4.검색화면에서 해당 가맹점 1개를 클릭해서 들어갔을 때 자세히 나오도록

기능5.예약페이지 들어갔을 때 내가 예약한 페이지 나오도록
기능6. 기능4에서 가맹점 1개를 클릭해서 들어가서 예약을 할 수 있도록

2.17 TO DO LIST

강사님
1.서버 확인 -> 완료됨
2.젠킨스 확인 -> 완료됨
3.HTTPS 인증서 확인 -> 수정중
4.구글,네이버,다음 사이트 등록

안효진님
1.flutter 웹뷰 완성

권영환님
1.알고리즘 flow 그려보고 -> 완료됨
2.검색 알고리즘 토의 -> 완료됨
3.검색 API 제작 -> 수정중

최태형님
1.가맹점 등록(멀티 이미지 등록 오류) -> 완료됨
+
기능1.users 테이블에서 auth(일반,가맹점)
에 따라서 마이페이지 데이터를 다르게 보여줘야 함.
일반 -> 내정보
가맹점 -> 내가 가지고 있는 가맹점 정보
기능2.마이페이지 -> 가맹점 -> 등록,수정,삭제,조회 -> 수정중
기능3.검색화면 검색했을 때 여러개의 리스트로 나오도록(간단히)
기능4.검색화면에서 해당 가맹점 1개를 클릭해서 들어갔을 때 자세히 나오도록
기능5.예약페이지 들어갔을 때 내가 예약한 페이지 나오도록
기능6.기능4에서 가맹점 1개를 클릭해서 들어가서 예약을 할 수 있도록

  • 평점,리뷰 시스템 알고리즘

2.24 TODOLIST

강사님
1.postgresql db timeout 수정 -> 확인중
2.전체적으로 소스 리뷰 -> 완료
3.스토어 여러개 크롤링

안효진님
1.webview 파란색 테두리 삭제
2.마이페이지 -> 가맹점 / 일반회원 구분 화면개발
3.앱로딩/웹로딩 화면 스플래쉬 추가 개발
4.만든 apk앱을 웹에 업로드

권영환님
1.추천 알고리즘 API 테스트
2.검색/예약 화면 제작

최태형님
1.기능 마이페이지 -> 가맹점 -> 수정 API 제작
2.가맹점 화면 부분
3.추천 시스템 알고리즘

2.18 TO DO LIST

강사님
1.HTTPS 인증서 확인 -> 완료
2.구글,네이버,다음 사이트 등록 -> 완료
3.robots.txt 및 구글 어날리틱스 설정 -> 완료

안효진님
1.flutter 웹뷰 완성 -> 완료
2.webview 파란색 테두리 삭제
3.마이페이지 -> 가맹점 / 일반회원 구분 화면개발
4.앱로딩 화면 스플래쉬 추가 개발

권영환님
1.추천 알고리즘 API 제작

최태형님
기능 마이페이지 -> 가맹점 -> 등록,수정,삭제,조회

맛집 추천 알고리즘에서의 개념 분리

처음 메인화면에 들어갔을 때
각종 카테고리
image

와 각종 조건별 추천하는 매장들을 보여주게되는데
image

image

image

위 list를 조회해 올 때 사용한 조건과

조회해온 리스트를 정렬 할 때 사용하는 조건은 다르게 분류해야 할 거 같습니다.

list를 조회해 올 때 사용할 만 한 조건은

image

이 되고

이미 불러온 리스트들을 정렬하는 방법은
image
으로 해야할 것 같습니다.

따라서 Controller java단에서 이미 불러온 리스트의 매장들을 각 조건별 가중치 점수를 줄때는
후자의 조건만 따질 수 있을거같습니다.

3월 3일 TODOLIST

안효진님.
1)최종 완료된 APK(파일 다운로드 페이지 업로드)
다운로드 파일 링크 ? apk 업로드(깃허브 ) -> 완료

권영환님
1)예약조회 -> 완료
2)알고리즘 정리해서 readme 추가(간트차트 위에다가)

최태형님
1)서버 업로드 -> 오류 수정
2)추천 알고리즘 readme 추가

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.