Coder Social home page Coder Social logo

woowacourse-teams / 2021-nolto Goto Github PK

View Code? Open in Web Editor NEW
42.0 3.0 6.0 9.55 MB

부담없이 자랑하는 작고 소중한 내 프로젝트 🧸✨

Home Page: https://nolto.site

HTML 0.32% TypeScript 35.60% JavaScript 1.71% Java 62.26% Vim Snippet 0.11% Shell 0.01%
java typescript spring-boot restdocs junit5 react docker nginx cloudwatch jacoco sonarqube jenkins react-query

2021-nolto's Introduction

🧸 놀토: 놀러오세요 토이프로젝트 🎈

부담없이 자랑하는 작고 소중한 내 토이프로젝트

서툰 프로젝트라도 누구나 뿌듯하게 자랑하고 공유하는 공간,

여기는 놀토입니다!

🎥 놀토 소개 영상

nolto video

🙋‍♀️ 놀토를 만든 사람들 🙋‍♂️

아마찌 조엘 포모 미키 지그 찰리



놀토에 사용된 기술 스택들 👨‍💻


놀토 인프라 구성 🎡

  • 21.11.08 이전 인프라 구조

  • 21.11.08 이후 인프라 구조

놀토 CI/CD 프로세스 🎯



⚙️ 기술 스택 ⚙️

2021-nolto's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

2021-nolto's Issues

[BE] 배포 인프라 구축

기능 요구 사항

  • Web server를 위한 EC2 구축
  • WAS를 위한 EC2 구축
  • 데이터베이스를 위한 EC2 구축

[BE] 좋아요 기능

기능 요구 사항

  • 좋아요가 안 눌린 상태라면 좋아요를 누를 수 있다
    • POST: /feeds/1/like
  • 좋아요가 눌린 상태라면 좋아요를 취소할 수 있다
    • POST: /feeds/1/unlike
  • 유저 토큰 검증 필요

[BE] 최신 피드 조회 기능

기능 요구 사항

  • 등록이 된 최신 순으로 프로젝트를 보여준다
    • GET: /feed/recent
  • 쿼리스트링으로 filter를 한다면, 조건에 알맞게 최신 순으로 프로젝트를 보여준다
    • GET: /feed/recent?filter=
      • sos
      • progress
      • complete

[BE] API문서화를 진행한다

기능 요구 사항

  • Spring Rest Docs를 사용하여 API 문서화
  • 문서화를 위한 컨트롤러 테스트에서는 MockMvc를 사용

[BE] 글 작성 기능

기능 요구 사항

  • 클라이언트가 작성한 글을 DB에 저장한다
    • POST :/feeds
  • Step에 따라 필수 작성 항목이 달라진다
    • deployedUrl은 complete만 필수
    • storageUrl, thumbnailUrl은 progress, complete 모두 선택
      • thumbnailUrl이 없다면 기본 이미지로 지정

[BUG] MariaDB Create Table 실패

내용

  • MariaDB Create Table 실패

시나리오

2021-07-13 07:52:37.031  INFO 19283 --- [           main] com.wooteco.nolto.NoltoApplication       : Started NoltoApplication in 5.775 seconds (JVM running for 6.397)
Hibernate:
    insert
    into
        users
        (email, image_url, nick_name, password)
    values
        (?, ?, ?, ?)
2021-07-13 07:52:37.116 TRACE 19283 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [[email protected]]
2021-07-13 07:52:37.117 TRACE 19283 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [VARCHAR] - [imageUrl]
2021-07-13 07:52:37.117 TRACE 19283 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [VARCHAR] - [미키]
2021-07-13 07:52:37.117 TRACE 19283 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [4] as [VARCHAR] - [user1]
2021-07-13 07:52:37.121  WARN 19283 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1146, SQLState: 42S02
2021-07-13 07:52:37.122 ERROR 19283 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : (conn=64) Table 'nolto.users' doesn't exist
2021-07-13 07:52:37.131  INFO 19283 --- [           main] ConditionEvaluationReportLoggingListener :

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-07-13 07:52:37.154 ERROR 19283 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: Failed to execute ApplicationRunner
	at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:785) [spring-boot-2.5.2.jar!/:2.5.2]
	at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:772) [spring-boot-2.5.2.jar!/:2.5.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:345) [spring-boot-2.5.2.jar!/:2.5.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) [spring-boot-2.5.2.jar!/:2.5.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) [spring-boot-2.5.2.jar!/:2.5.2]
	at com.wooteco.nolto.NoltoApplication.main(NoltoApplication.java:10) [classes!/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_292]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_292]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_292]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_292]
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) [nolto-0.0.1-SNAPSHOT.jar:na]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) [nolto-0.0.1-SNAPSHOT.jar:na]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) [nolto-0.0.1-SNAPSHOT.jar:na]
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) [nolto-0.0.1-SNAPSHOT.jar:na]
Caused by: org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:259) ~[spring-orm-5.3.8.jar!/:5.3.8]
	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:233) ~[spring-orm-5.3.8.jar!/:5.3.8]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:551) ~[spring-orm-5.3.8.jar!/:5.3.8]
	at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.3.8.jar!/:5.3.8]
	at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) ~[spring-tx-5.3.8.jar!/:5.3.8]
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152) ~[spring-tx-5.3.8.jar!/:5.3.8]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar!/:5.3.8]
	at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174) ~[spring-data-jpa-2.5.2.jar!/:2.5.2]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar!/:5.3.8]
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.8.jar!/:5.3.8]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar!/:5.3.8]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.8.jar!/:5.3.8]
	at com.sun.proxy.$Proxy97.saveAll(Unknown Source) ~[na:na]
	at com.wooteco.nolto.DataLoader.run(DataLoader.java:35) ~[classes!/:na]
	at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:782) [spring-boot-2.5.2.jar!/:2.5.2]
	... 13 common frames omitted
Caused by: org.hibernate.exception.SQLGrammarException: could not execute statement
	at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:57) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:43) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3196) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3802) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:84) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:330) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:123) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:185) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:128) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:99) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:720) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:706) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_292]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_292]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_292]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_292]
	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) ~[spring-orm-5.3.8.jar!/:5.3.8]
	at com.sun.proxy.$Proxy90.persist(Unknown Source) ~[na:na]
	at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:597) ~[spring-data-jpa-2.5.2.jar!/:2.5.2]
	at org.springframework.data.jpa.repository.support.SimpleJpaRepository.saveAll(SimpleJpaRepository.java:631) ~[spring-data-jpa-2.5.2.jar!/:2.5.2]
	at org.springframework.data.jpa.repository.support.SimpleJpaRepository.saveAll(SimpleJpaRepository.java:81) ~[spring-data-jpa-2.5.2.jar!/:2.5.2]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_292]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_292]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_292]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_292]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
	at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:529) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
	at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:599) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar!/:5.3.8]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:163) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar!/:5.3.8]
	at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) ~[spring-data-commons-2.5.2.jar!/:2.5.2]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar!/:5.3.8]
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.8.jar!/:5.3.8]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.8.jar!/:5.3.8]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.8.jar!/:5.3.8]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar!/:5.3.8]
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.8.jar!/:5.3.8]
	... 22 common frames omitted
Caused by: java.sql.SQLSyntaxErrorException: (conn=64) Table 'nolto.users' doesn't exist
	at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:163) ~[mariadb-java-client-2.1.2.jar!/:na]
	at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:106) ~[mariadb-java-client-2.1.2.jar!/:na]
	at org.mariadb.jdbc.MariaDbStatement.executeExceptionEpilogue(MariaDbStatement.java:235) ~[mariadb-java-client-2.1.2.jar!/:na]
	at org.mariadb.jdbc.MariaDbPreparedStatementClient.executeInternal(MariaDbPreparedStatementClient.java:224) ~[mariadb-java-client-2.1.2.jar!/:na]
	at org.mariadb.jdbc.MariaDbPreparedStatementClient.execute(MariaDbPreparedStatementClient.java:159) ~[mariadb-java-client-2.1.2.jar!/:na]
	at org.mariadb.jdbc.MariaDbPreparedStatementClient.executeUpdate(MariaDbPreparedStatementClient.java:192) ~[mariadb-java-client-2.1.2.jar!/:na]
	at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-4.0.3.jar!/:na]
	at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar!/:na]
	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
	... 71 common frames omitted
Caused by: java.sql.SQLException: Table 'nolto.users' doesn't exist
Query is: insert into users (email, image_url, nick_name, password) values (?, ?, ?, ?), parameters ['[email protected]','imageUrl','미키','user1']
	at org.mariadb.jdbc.internal.util.LogQueryTool.exceptionWithQuery(LogQueryTool.java:146) ~[mariadb-java-client-2.1.2.jar!/:na]
	at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:217) ~[mariadb-java-client-2.1.2.jar!/:na]
	at org.mariadb.jdbc.MariaDbPreparedStatementClient.executeInternal(MariaDbPreparedStatementClient.java:218) ~[mariadb-java-client-2.1.2.jar!/:na]
	... 76 common frames omitted

[BE] 핫 토이 피드 조회 기능

기능 요구 사항

  • 인기가 많은 프로젝트를 보여준다
    • GET: /feed/hot
  • "인기"의 기준?
    • 좋아요가 많은 순?
    • 댓글 추가시 댓글 갯수 포함?
    • 상위 노출 일정기간 후 내려가야하지 않을까?
      • 기간을 정해둘까? (최근 한 달?)
    • 이번 스프린트 기간에는 좋아요 갯수로 인기 판단

[BE] 프로젝트 초기 설정

기능 요구 사항

  • 백엔드 프로젝트 초기 설정
    • 빌드 도구 선택
    • 언어 및 버전 선택
    • dependency 추가

[BE] feed 반환 바디 수정

기능 요구 사항

  • feed 반환 값에서 feed 키를 제거하여 반환한다
  • 기존 응답 값
[
    {
        "author": {
            "id": 1,
            "nickname": "미키",
            "imageUrl": "imageUrl"
        },
        "feed": {
            "id": 1,
            "title": "title1",
            "content": "content1",
            "step": "PROGRESS",
            "sos": true,
            "thumbnailUrl": ""
        }
    },
    {
        "author": {
            "id": 1,
            "nickname": "미키",
            "imageUrl": "imageUrl"
        },
        "feed": {
            "id": 2,
            "title": "title2",
            "content": "content2",
            "step": "COMPLETE",
            "sos": false,
            "thumbnailUrl": ""
        }
    }
]
  • 수정되야할 반환 값
[
    {
        "author": {
            "id": 1,
            "nickname": "미키",
            "imageUrl": "imageUrl"
        },

      "id": 1,
      "title": "title1",
      "content": "content1",
      "step": "PROGRESS",
      "sos": true,
      "thumbnailUrl": ""
    },
    {
        "author": {
            "id": 1,
            "nickname": "미키",
            "imageUrl": "imageUrl"
        },
        "id": 2,
        "title": "title2",
        "content": "content2",
        "step": "COMPLETE",
        "sos": false,
        "thumbnailUrl": ""
    }
]

[BE] Controller에 들어오는 RequestBody에 @Valid 어노테이션 붙이기

기능 요구 사항

  • 현재 RequestDto안에는 javax.validation 어노테이션으로 지정 다 해둠

    • @email
    • @NotBlank
  • 하지만 정작 컨트롤러에서 이를 적용시키는 @Valid 어노테이션 안써줌

  @PostMapping("/login")
  public ResponseEntity<TokenResponse> login(@RequestBody TokenRequest tokenRequest) {
      TokenResponse response = authService.login(tokenRequest);
      return ResponseEntity.ok(response);
  }

[BE] 피드 단일 조회 기능

기능 요구 사항

  • 피드를 조회한다.

  • 글 조회 Response

    • 비회원의 경우 Liked = false
    • 회원의 경우 Liked=true
  • 이슈 담당자가 추후 재정리

[BE] 로그인 기능

기능 요구 사항

  • 이메일과 비밀번호를 입력받아 검증한다.
  • 검증이 완료된 유저는 토큰을 발급한다.
  • 회원 더미 데이터 추가한다.

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.