kimhanui / 2020-interfaceapp-api Goto Github PK
View Code? Open in Web Editor NEW세종대학교 컴퓨터 동아리 인터페이스의 출석체크용 앱입니다.
License: Apache License 2.0
세종대학교 컴퓨터 동아리 인터페이스의 출석체크용 앱입니다.
License: Apache License 2.0
local, develop, prod
로 나눴는데 develop 에서 503 에러가 남.
application.properties
서버에 따로 올리려면?
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에서 실행해야함)
spring.jpa.hibernate.ddl-auto = update
로 변경하여 gradle에서 build는 성공했지만 갑자기 로컬서버 build실패각각 첨부(intellij, chrome개발자도구, postman 등..)
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]
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);
}
각각 첨부(intellij, chrome개발자도구, postman 등..)
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
method requested
공지사항(posts, entity)
출석체크(attendance, dto) , url ->member update -> db에서 날짜 업데이트
동아리 전체명부관리(member, entity)
1.pw로 동아리 부원인증(일회성)
2. 출석체크는 매번(이름,기수,암호)
dto
비번관리
swagger
스프링부트 +swagger로 api문서 자동화 적용해보기 -> 여기
queryDSL적용해보기
각각 첨부(intellij, chrome개발자도구, postman 등..)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime modifiedDate;
현재
spring.profiles.active=develop
(active설정을 어디로 하느냐에 따라 다른 리소스를 쓸 수 있음https://wedul.site/590
https://tutorial-extensions.djangogirls.org/ko/heroku/
web: java -Dspring.server.port=8080 -Dspring.profiles.active=production $JAVA_OPTS -jar infe-0.0.1-SNAPSHOT.jar
각각 첨부(intellij, chrome개발자도구, postman 등..)
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로 작성한 문법 오류인 것 같다.
ddl-auto = valid
H2가 jpa의 naming strategy에 상관없이 Uppercase로 테이블 생성하기때문에 발생 (h2자체 이슈로 보는 것 같다.)
;DATABASE_TO_UPPER=false
을 db url에 붙여준다.
실제로 나도 data.sql
에 소문자를 이용해 작성했었는데, 모든 문자를 대문자로 테이블을 생성한다는 의미인 것 같다.
답변 출처: https://qastack.kr/programming/5763747/h2-in-memory-database-table-not-found
앞으로 할 것
GET
공지사항 전체 조회 ->/api/v1/posts/list
공지사항
저장,수정,삭제,전체삭제,전체조회
끝
@RestControllerAdvice
이용해서 global Exception처리 로직 추가
사용자의 위/경도 관리자것과 비교
{"pw":"1231", "lat":"31.43434", "lon":"32.23232"}
POST
사용자는 출석체크 요청함 lat,lon 추가
{ "studentId":"170170", "name": "urgot", "groupNum":"29",
"passkey":"VJ5FG", "dateTime":"2020-11-11T00:10",
"lat":"31.43434", "lon":"32.23232"
}
기존 예외: 회원존재무, passkey불일치
새 예외:
사용자 == 관리자 lat,lon: 처리 -> raise exception("출석위치가 다릅니다")
Meeting날짜,출석키
passkey,lat,lon
캘린더
POST
관리자가 일정 저장GET
사용자가 일정 전체조회
{“date":”2020/12/31”,“title":”2020년 마지막",“content":“byebye 2020!"}
사용자 명부 확인
{"state":"휴학", "generation":"29기", "department":"컴퓨터공학과",
"studentID":"16011094", "name":"주이식", "phoneNumber":"010-9557-1081",
"contact":[email protected], "firstDues":"X", "secondDues":"X",
"openingMeeting":"X", "finalMeeting":"X"}
로그인용 패스워드 추가
각 사용자에게 토큰 추가 ->토큰테이블(멤버와매칭하진 않은) 생성한다.
매 날짜마다 참여한 멤버 조회할 수 있게 --> 확보용량 : 한달? #9
swagger
스프링부트 +swagger로 api문서 자동화 적용해보기 -> 여기
queryDSL적용해보기
reset --hard {특정커밋}
) 푸쉬Originally posted by @kimhanui in #18 (comment)
@Scheduled
등을 사용할 수도 있지만 근본적인 작동은 Thread라는 개념에서 시작함.http://localhost:8080/api/v1/member/1
로 지정한 회원을 삭제하는 아주 간단한 요청이었는데 500에러가 남.각각 첨부(intellij, chrome개발자도구, postman 등..)
contraint violation - MEETING_MEMBER foreign key가 MEMBER의 id 1과 연관관계임.
친애하는 주인장에게,
나는 문제를 겪고있다.
당신은 나의 추종자가 되었다.
나는 당신을 모른다.
해결해주세요.
from james
앞으로 할 것
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적용해보기
사용자의 토큰이 변경됐을 때 변경대신 추가됨
. 누적된 토큰을 처리할 방법 생각해야함.
- fcmToken 테이블을 조회해서 중복이면 에러메시지 출력, 중복 아닐시 테이블에 저장
- 서버에서 안드로 주는 데이터 -> 패스워드별로 저장된 사용자 정보들
token
테이블만 만들면 대리출석 못하고 한번만 출석할 수 있음
but 테이블이 trash data만 쌓이는 테이블이 됨
출석직후부터 token
은 의미가 없기 때문. 이에 대한 dbcp 사용에 영향을 끼치는지 알아봐야될 것 같음...
해결 방안1: 하나의 모임 or 하루 단위로 테이블 초기화하기
쉘 스크립트 작성
해결 방안2: 명부
에 token
칼럼 만들기
추가 이슈: 명부에 token
칼럼 만들어도 출석인증시 틀/맞 여부 비교할 때 명부에 그사람이 없을 수도 있음
-> 미리 token집어넣자
토큰
table
안 만들어도 됌
1. 동아리 가입 후 최초 1회 **본인인증** 하게 함: `토큰, 자기 정보` request
2. 출석시: `토큰,위치` -> `자기 폰으로 하는지+ 대리출석 불가 현장에서 하는지,` 필터링할 수 있음
이때
자기정보
안들어가도토큰
이 있어서 ㄱㅊ
startTime
보다 endTime
이 나중인지 확인하는 예외추가할 예정A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.