GithubHelp home page GithubHelp logo

kimhanui / 2020-interfaceapp-api Goto Github PK

View Code? Open in Web Editor NEW
5.0 2.0 1.0 879 KB

세종대학교 컴퓨터 동아리 인터페이스의 출석체크용 앱입니다.

License: Apache License 2.0

Java 92.98% JavaScript 2.25% Mustache 4.77%
spring-boot gradle test-code spring-data-jpa

2020-interfaceapp-api's Introduction

Hi there 👋

Projects

Readme Card

2020-interfaceapp-api's People

Contributors

kimhanui avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

dev210202

2020-interfaceapp-api's Issues

profile관리, db접속 파일 관리

  1. profile : local, develop, prod로 나눴는데 develop 에서 503 에러가 남.
    • 잘못 설정한 부분 찾기
  2. db접속 파일 application.properties 서버에 따로 올리려면?
    • Heroku contrainer registry(docker based)로 올려보기
    • ${JAWSDB_MARIA_URL} 같은 config var을 이용해서 정보 은닉

[BUG] project 생성 by gradle 에러

로그

Caused by: java.lang.NoClassDefFoundError: org/gradle/api/internal/plugins/DefaultConvention

원인

gradle x intellij 또는 intellij 내부 플러그인의 버전이 맞지 않아서 생기는 오류

해결

gradle이 6.x버전을 쓰고 있다면 5.x로 내려서 해결

  • 당시 환경
    -> intellij: 2018.3.2
    -> gradle: 6.4

  • gradle 버전 변경 command
    -> gradlew wrapper --gradle-version 5.6.4 (당연하지만 프로젝트 root에서 실행해야함)

image
해결하면 sync 잘 맞음

[BUG] gradle build 실행 에러(in test, ddl-auto = create)

Expectation & Result

  • 참고: issue #13
  • spring.jpa.hibernate.ddl-auto = update로 변경하여 gradle에서 build는 성공했지만 갑자기 로컬서버 build실패
  • 원인은 외래키 문제(`

Error Log & Screenshots

각각 첨부(intellij, chrome개발자도구, postman 등..)

  • intellij 상 로그
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "alter table meeting_member drop foreign key FKvkkq2bos055dev77230o8sf6" via JDBC Statement

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MEETING_MEMBER" not found; SQL statement:
alter table meeting_member drop foreign key FKvkkq2bos055dev77230o8sf6 [42102-199]

[BUG] Member 등록 테스트코드 에러(포트설정관련?)

Expectation & Result

  • SpringRunner.class로 테스트 코드 돌리던 중 에러 발생
@RunWith(SpringRunner.class)
//WebMvcTest안쓴 이유: JPA 기능이 작동하지 않기 때문, Controller와 ControllerAdvice 등 외부연동과 관련된 부분만 활성화됨.
//JPA기능까지 한번에 테스트할때는 @SpringBootTest + TestRestTemplate을 사용하면 된다.
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MemberControllerTest {
    @LocalServerPort
    private int port;

    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private MemberRepository memberRepository;

    @After
    public void tearDown() throws Exception {
        memberRepository.deleteAll();
    }

    @Test
    public void Member_등록된다() throws Exception {
        //given
        Long STUDENTID = 170170L;
        String NAME = "baron";
        Long GROUPNUM = 30L;

        MemberRequestDto dto = MemberRequestDto.builder()
                .studentId(STUDENTID)
                .name(NAME)
                .groupNum(GROUPNUM)
                .build();
        String url = "http://localhost:+"+port+"/api/v1/member";

        // when
        ResponseEntity<Long> responseEntity = restTemplate.postForEntity(url,dto, Long.class);

        // then
        assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
        assertThat(responseEntity.getBody()).isGreaterThan(0L);

        List<Member> members = memberRepository.findAll();
        assertThat(members.get(0).getStudentId()).isEqualTo(STUDENTID);
        assertThat(members.get(0).getName()).isEqualTo(NAME);
        assertThat(members.get(0).getGroupNum()).isEqualTo(GROUPNUM);
    }

Error Log & Screenshots

각각 첨부(intellij, chrome개발자도구, postman 등..)

  • intellij 상 로그
     org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost/+63828/api/v1/member": Connection refused: connect; nested exception is java.net.ConnectException: Connection refused: connect
    
      at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:744)
      at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:670)
      at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:445)
      at org.springframework.boot.test.web.client.TestRestTemplate.postForEntity(TestRestTemplate.java:489)
      at com.infe.app.web.MemberControllerTest.Member_등록된다(MemberControllerTest.java:58)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:498)
      at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
      at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
      at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
      at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
      at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
      at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
      at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
      at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
      at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
      at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
      at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
      at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
      at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
      at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
      at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
      at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
      at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
      at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
      at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
      at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
      at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
      at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
      at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
    
      Caused by: java.net.ConnectException: Connection refused: connect
      at java.net.DualStackPlainSocketImpl.connect0(Native Method)
      at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
      at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
      at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
      at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
      at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
      at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
      at java.net.Socket.connect(Socket.java:589)
      at java.net.Socket.connect(Socket.java:538)
      at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
      at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
      at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
      at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
      at sun.net.www.http.HttpClient.New(HttpClient.java:339)
      at sun.net.www.http.HttpClient.New(HttpClient.java:357)
      at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1220)
      at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1156)
      at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)
      at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:984)
      at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:76)
      at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
      at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
      at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:735)
      ... 35 more
    

Related page

[ENH] progress

method requested

공지사항(posts, entity)

  • findAll
  • delete
  • insert
  • update
  • deleteAll

출석체크(attendance, dto) , url ->member update -> db에서 날짜 업데이트

  • insert (암호, 시작시간, 종료시간)dto,
    • (이름,기수,암호)dto
  • findAll
    - ver.1 : 회원,모임정보포함한 모든 회원리스트
    - ver.2: 날짜 정보 입력하면 해당 모임에 출석한 회원리스트
  • deleteAll
  • findMeeting 추가(이미 있는 출석암호인지 확인용)

동아리 전체명부관리(member, entity)

  • insert
  • findAll
  • find추가
  • delete
  • update

1.pw로 동아리 부원인증(일회성)
2. 출석체크는 매번(이름,기수,암호)

dto

  • 출석체크: AttendanceRequestDto
    -> 이름,기수, 암호
  • pw로 동아리 부원인증
    ->관리자RequestDto: 비번insert, update
    ->유저requestDto: 비번check

비번관리

  1. (domain) pw -> db칼럼 생성(매번 업데이트)
  • 안드에서 "시간지남"문구+ 접근막음 ( 안드에서 시간관리- 30분 내 카운트다운형식?)
  1. 매 날짜마다 참여한 멤버 조회할 수 있게.
  • 확보용량 : 한달?

swagger
스프링부트 +swagger로 api문서 자동화 적용해보기 -> 여기
queryDSL적용해보기

[BUG] 공지사항-findAllDesc @JsonFormat적용 안됨

Expectation & Result

  • PostsListResponseDtoLocalDateTime modifiedDate@JsonFormat적용했지만 반영안됨
  • image

Error Log, Code & Screenshots

각각 첨부(intellij, chrome개발자도구, postman 등..)

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime modifiedDate;

Related page

[BUG] local, develop, prod 환경 나누고 싶다ㅠㅠ(.properties , Procfile)

Expectation & Result (1,2,3 다 안됨)

현재

1. application.properties 파일 분리 방식

  • application.properties -> spring.profiles.active=develop (active설정을 어디로 하느냐에 따라 다른 리소스를 쓸 수 있음
  • local: h2, develop: h2, prod: mariaDB 쓰려고 함, jpa 설정(스키마 생성전략 등) 조금씩 다르게 맞춰줌.
  • test: h2로도 따로 만들어줌.
    • 이유: gradlew bulid 할때 test도 실행하는데 local 프로퍼티가 잘 안 따라오는 듯해서 따로 test 프로퍼티 만들어서 개발할때와 분리시켜 줌.

2. Procfile

3. Heroku 환경변수(config set)

[BUG] @Query로 문법작성시 오류(namedQuery=true)

Expectation & Result

Error Log & Screenshots

각각 첨부(intellij, chrome개발자도구, postman 등..)

  • intellij 상 로그
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [select m from Member m Join m.meetings mt where mt.createdDateTime = ? order By m.studentId DESC]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement

@query로 작성한 문법 오류인 것 같다.

Related page

[PROD]

  • ddl-auto = valid
  • doc 완료

Task

앞으로 할 것

  • GET 공지사항 전체 조회 ->/api/v1/posts/list

    공지사항 저장,수정,삭제,전체삭제,전체조회

  • @RestControllerAdvice 이용해서 global Exception처리 로직 추가

  • 사용자의 위/경도 관리자것과 비교

    • 1. 'POST`관리자가 출석체크 저장
      {"pw":"1231", "lat":"31.43434", "lon":"32.23232"}
      
    • 2. POST 사용자는 출석체크 요청함 lat,lon 추가
      { "studentId":"170170", "name": "urgot", "groupNum":"29", 
      "passkey":"VJ5FG", "dateTime":"2020-11-11T00:10",
      "lat":"31.43434", "lon":"32.23232"
      } 
      
    • 3. 예외처리
      기존 예외: 회원존재무, passkey불일치
      새 예외: 
          사용자 == 관리자 lat,lon:  처리 -> raise exception("출석위치가 다릅니다")
      
    • 4. 관리자가 출석체크 조회
      • 사용자별 출첵 조회 Meeting날짜,출석키
      • 암호별 출석체크한 회원조회
      • 관리자가 생성한 passkey 조회 passkey,lat,lon
      • 특정 passkey 삭제
  • 캘린더

    • POST관리자가 일정 저장
    • GET사용자가 일정 전체조회
      {“date":”2020/12/31”,“title":”2020년 마지막",“content":“byebye 2020!"}
      
  • 사용자 명부 확인

    • 서버에서 전달할 dto 필드
       {"state":"휴학", "generation":"29기", "department":"컴퓨터공학과", 
       "studentID":"16011094", "name":"주이식", "phoneNumber":"010-9557-1081", 
       "contact":[email protected], "firstDues":"X", "secondDues":"X", 
       "openingMeeting":"X", "finalMeeting":"X"}
      
  • 로그인용 패스워드 추가

    • value: admin - interfaceAdmin, value: user - interfaceUser
  • 각 사용자에게 토큰 추가 ->토큰테이블(멤버와매칭하진 않은) 생성한다.

  • 매 날짜마다 참여한 멤버 조회할 수 있게 --> 확보용량 : 한달? #9

  • swagger
    스프링부트 +swagger로 api문서 자동화 적용해보기 -> 여기
    queryDSL적용해보기

[BUG] delete member 안됨(연관관계 삭제)

Expectation & Result

  • http://localhost:8080/api/v1/member/1로 지정한 회원을 삭제하는 아주 간단한 요청이었는데 500에러가 남.

Error Log & Screenshots

각각 첨부(intellij, chrome개발자도구, postman 등..)

  • intellij 상 로그
    당시 로그 캡쳐 못함 키워드는
    contraint violation - MEETING_MEMBER foreign key가 MEMBER의 id 1과 연관관계임.

Related page

[BUG]: follow 처리 오류

친애하는 주인장에게,
나는 문제를 겪고있다.
당신은 나의 추종자가 되었다.
나는 당신을 모른다.
해결해주세요.
from james

process 2

앞으로 할 것

  • 1. 매 날짜마다 참여한 멤버 조회할 수 있게 --> 확보용량 : 한달? #9

  • 2. 로직: member insert 중복검사

  • 3. 기수순 정렬

  • 4. test code 추가

  • 4. mariadb 매 run마다 초기화하기

  • 5. application.properties파일을 어떻게 숨겨서 올리는가 (직접 sh만들어서 jar파일 만들어서 올리면 ㄱㅊ할 것 같은데..)
    -> ${JAWSDB_MARIA_URL} 등의 config var로 정보 은닉

  • dev, prod db 연결확인하기

  • index.mustache에서 아무posts도 없으면 404에러나는듯 -->mustache는 다 삭제or 주석처리 함.

swagger
스프링부트 +swagger로 api문서 자동화 적용해보기 -> 여기
queryDSL적용해보기

[DB] Fcm Token관리 방법 (테이블 생성 vs 회원과 매칭 vs orElse)

이슈

사용자의 토큰이 변경됐을 때 변경대신 추가됨. 누적된 토큰을 처리할 방법 생각해야함.

dev210202/Interface_Android#8 (comment)

- fcmToken 테이블을 조회해서 중복이면 에러메시지 출력, 중복 아닐시 테이블에 저장
- 서버에서 안드로 주는 데이터 -> 패스워드별로 저장된 사용자 정보들

고민하는 점

token 테이블만 만들면 대리출석 못하고 한번만 출석할 수 있음 but 테이블이 trash data만 쌓이는 테이블이 됨
출석직후부터 token은 의미가 없기 때문. 이에 대한 dbcp 사용에 영향을 끼치는지 알아봐야될 것 같음...

가능한 해결방안

  • 해결 방안1: 하나의 모임 or 하루 단위로 테이블 초기화하기
    쉘 스크립트 작성

  • 해결 방안2: 명부token칼럼 만들기
    추가 이슈: 명부에 token칼럼 만들어도 출석인증시 틀/맞 여부 비교할 때 명부에 그사람이 없을 수도 있음
    -> 미리 token집어넣자

    토큰 table 안 만들어도 됌

    1. 동아리 가입 후 최초 1회 **본인인증** 하게 함: `토큰, 자기 정보` request
    2. 출석시: `토큰,위치` -> `자기 폰으로 하는지+ 대리출석 불가 현장에서 하는지,` 필터링할 수 있음
    

    이때 자기정보 안들어가도 토큰이 있어서 ㄱㅊ

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.