목록전체 글 (518)
개발놀이터
데이터를 저장할 때 '생성된 시간 정보'와 '수정된 시간 정보'는 여러모로 많이 사용되고 또 중요합니다. JPA를 사용하면서 @CreatedDate, @LastModifiedDate를 사용하여 생성된 시간 정보, 수정된 시간 정보를 자동으로 저장할 수 있는데요. 사용 방법과 동작 원리에 대해서 한번 알아보도록 하겠습니다. import lombok.Getter; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; imp..
대략 10만명의 회원을 거느리는 웹 서비스를 운영한다고 가정했을 때 우린 매일마다 회원들의 상태변화를 감지하고 운용할 수 있어야 합니다. 가령 오늘까지 우리 서비스에 접속하지 않은지 1년 이상이 지난 회원의 상태는 휴면으로 전환시키고 휴면으로 전환된 회원은 다시 로그인 했을 때 본인인증 절차를 거치도록 하는 것이 서비스 보안에 좋겠죠. 또는 후불로 청구되는 유료 서비스를 이용하고 과금액을 미납한지 한 달째 되는 회원에 대해서도 매일마다 집계하여 그에 맞는 추심을 한다거나 채권 관리대상으로 지정하여 우리서비스의 수익구조를 안정적으로 보호해야 하는 경우도 있습니다. 만약 이런 일들을 사람의 손을 반복적으로 거쳐야 한다면 매우 고단한 일이 될겁니다. 스프링부트 프레임워크에서는 이러한 일괄처리를 쉽게 안정적으로..
실시간 알람은 원래 하려고 한게 아닌데 주변인들한테 지금 내가 채팅프로그램을 만들고있는데 실시간 알람이 있으면 좋겠냐 없으면 좋겠냐 물어봤을 때 전부 다 있어야 할거같다고 해서 만들었습니다. 처음에 계획은 axios를 이용해 /chat/get_room_id 라는 url로 접근해 현재 내가 갖고있는 채팅방의 roomId를 자바스크립트 배열에 저장하고 배열에 있는 값을 꺼내서 for문을 돌려 모두 subscribe 연결을 하려고 했습니다. 근데 자바스크립트의 비동기 문제 때문에 값을 저장하기 전에 subscribe로 연결되어버려서 자바스크립트 배열에 값이 텅텅 비어있는 상황이 연출되었습니다. 그래서 async await 를 이용해 순서를 바로잡는데에는 성공했지만... 웹 소켓 connect가 안되는 현상이 ..
메세지를 보내기 전에 jwt 인증토큰을 검증해서 검증된 사용자만 채팅을 칠 수 있게 만들었습니다. jwt 인증토큰을 만들고 검증하는 코드는 다 만들었는데 jwt 인증토큰을 헤더에 어떻게 담는지 몰라서 한참을 헤맸습니다. 헤더에서 jwt 인증토큰을 꺼내와야 한다는데 헤더에 어떻게 하는건지 원... 그래서 그냥 컨트롤러에서 response 객체를 받아와서 setHeader로 집어넣었습니다. (이렇게 하는거 맞나?) https://kukekyakya.tistory.com/12 스프링부트 웹소켓 stomp를 이용한 실시간 알림 구현 스프링부트, stomp를 이용해서 실시간 알림을 받을 수 있도록 해보겠습니다. 구현할 내용은 다음과 같습니다. 1. 사용자 1번이 접속해서 웹소켓이 열린다. 2. 사용자 2번이 ..
우선 가장 중요한 채팅 기능을 만들어봤습니다. 웹 소캣 중에서도 SocketJS와 STOMP 프로토콜을 이용해 만들었습니다. 코드는 구글에서 검색해서 복붙했지만 디비에 입력하기 위해서 코드를 많이 수정하긴 했습니다. 따라 만드시려면 SocketJS와 STOMP프로토콜의 대략적인 이해는 필요하다고 생각합니다.(완전히 다 이해하진 않더라도 어떻게 굴러가는지는 이해해야 한다는 소리입니다.) 그리고 중요했던게 채팅 치는 순간 나와 상대방을 구별하는 방법이 필요했습니다. 카톡만 하더라도 나는 노란색 상대방은 흰색 이렇게 정해져있기 때문에 그냥 일자로 쭉 뽑을게 아니었기 때문에 구별해야했습니다. 문제는 웹 소켓에 연결해서 하는 채팅은 자바스크립트로 구별이 가능했지만 이미 디비에 저장되어있는 채팅은 어떻게 구별할지 ..
교수님께서 1학기만 캡스톤디자인 하는 것 처럼 말씀하셔서 2학기는 없을 줄 알았는데 2학기도 있었네요... 좀 난감하긴 하지만 한번 해보겠습니다. 1. 왜 중고거래 사이트인지? 생각보다 아주 간단한 이유입니다. 바로 채팅 기능에 대해서 공부해보고 싶었기 때문이죠. 채팅 기능을 구현하려면 웹 소캣을 써야한다는 사실은 알고 있었습니다. 하지만, 웹 소캣을 한번도 안써봤고 한번쯤 써보고싶어서 선택했습니다. 또한, docker에 대해서도 공부해보고 싶어서 겸사겸사 선택했습니다.(docker와 중고거래 사이트를 선택한 이유는 전혀 관계없습니다.) 그럼 카톡은 왜 아니냐. 라고 하신다면 카톡처럼 채팅기능만 들어가있는 (물론 채팅말고도 엄청나게 많은걸 지원한다는걸 알고있습니다. 하지만, 주 기능이 채팅이라 저렇게 말..
티스토리 카테고리 아래 카테고리를 또 나눌 수 있다는 것을 오늘에서야 알았다.(머쓱..) 이미 앞선 카테고리들은 망했으니까 지금이라도 잘 써야겠습니다. (추후에 정리할듯..?) 시작하기전에 Q. 캡스톤 디자인이란? A. 그냥 졸업 작품입니다. 학교에서도 졸업 작품을 좀 멋드러지게 표현하고 싶었나봅니다. 시작하기 전에 (2) Q. 좋은 포트폴리오란 무엇일까요? A. 저같은 애송이가 답변하긴 좀 뭣하지만... 좋은 포트폴리오는 제 생각에 스토리가 있는 포트폴리오라고 생각합니다. 그 이유는 너무 길어서 생략하겠습니다. 스토리라함은 내가 어떤 문제가 있어서 혹은 세간에 어떤 문제가 있어서 그것을 해결하는 프로젝트를 만드는 것입니다. 예를 들어서 내가 뭘 하다가 음...이게 있으면 좋을거같다. 해서 만드는 포트폴..
이번엔 쉘 스크립트를 작성해서 git pull부터 빌드해서 실행하기 까지의 과정을 자동화시키려고 한다. 일단은 이전에 clone에서 받은 프로젝트 폴더로 들어가보겠다. 필자는 chatting이라는 리포지토리 이름을 사용하고 있다. 우선 이 폴더를 sources라는 폴더로 통째로 옮긴다. # sources 폴더 생성 mkdir sources # chatting 폴더를 sources 폴더 내부로 옮기기 mv chatting ./sources/ # sources 폴더로 들어가기 cd sources 그리고 chatting 폴더에 들어가서 gradlew의 권한을 바꿔준다. # chatting 폴더로 들어가기 cd chatting # gradlew의 권한 변경 chmod + ./gradlew # 이전 디렉토리로 복..
gradlew에 권한이 없어서 생기는건 구글링해보니 지겹도록 알겠다. 문제는 구글링해서 나오는 chmod 755 gradlew chmod +x gradlew 이런거 다안통하더라 그래서 짜증나서 deploy.sh 파일 열어서 build gradlew하기 직전에 chmod +x gradlew 삽입했더니 해결됐다.
몇시간 동안 별에별 짓은 다해봤다. 1. gradle 버전를 바꾸면 된다고 해서 wrapper폴더에 있는 gradle.properties에 버전을 4.10.2로 바꿔보기 2. swap 메모리 4.0기가로 늘리기 3. gradle 깔고 gradle --debug build 하고 재시작 이렇게까지 했는데도 해결 안된 사람을 위해 남긴다. stackoverflow에서 해결방법은 찾았으며 build.gradle에 tasks.withType(Test) { scanForTestClasses = false include "**/*Test.class" } 를 추가하니 정상적으로 빌드가 됐다.