Java 프로젝트
-
[USports] HTTPS
[USports] HTTPS 백엔드는 HTTP 프로토콜을 사용하고, 프론트는 HTTPS를 사용하여 배포했을 때에 웹소켓이 잘 안 먹혔다 웹소켓 같은 경우 HTTP는 ws 그리고 HTTPS는 wss 프로토콜을 사용하게 된다 그래서 배포를 했을 때에, 실시간 채팅을 제대로 구현하기 위해서는 백엔드에서 HTTPS 프로토콜을 사용해야 겠다고 생각했다 여기서 HTTPS를 사용하면 자동으로 wss 프로토콜로 바뀌다고 한다 대부분이 도메인을 구매해서, HTTPS로 바꿨다 하지만 개인적으로, 백엔드는 Rest API만 구축했지, 굳이 도메인까지 구매를 해야할까? 라는 의문점이 들기 시작했다 다행히, 도메인 구매 없이 HTTPS로 바꾸는 방법이 존재했다 Caddy와 nip.io를 사용하는 것이었다 nip.io : 무료 ..
2024.01.14
-
[USports] Spring AWS 배포
[USports] Spring AWS 배포 배포란? 프로젝트를 하다 보면, 프로젝트 테스트를 위해 localhost, 즉 로컬 서버로 어플리케이션을 띄운다 localhost는 '내 컴퓨터'의 서버를 사용하는 것이라서, 다른 사람들이 내 어플리케이션을 사용하기 위해서는, '내' 컴퓨터의 IP 주소, 그리고 컴퓨터의 주소까지 알아야 할 것이다 근데 이렇게 하면, 내가 컴퓨터를 끄게 되면, 내 어플리케이션을 사용하는 사람도 어플리케이션을 사용하지 못 할 것이다 그래서 그 localhost를 클라우드 서버에 넣어두는 것이다 여기서 클라우드 서버는, 클라우드 컴퓨터로, 해당 컴퓨터에 내 어플리케이션을 올려두는 것이다 이렇게 하면, 클라우드가 없어지지 않는 이상, 어플리케이션은 24시간 돌아가게되고, 다른 유저가 ..
2024.01.14
-
[USports] Member OAuth with 프론트엔드
[USports] Member OAuth with 프론트엔드 OAuth with 프론트엔드 앞서 OAuth2 client를 가지고 간편 로그인을 구현했다 OAuth2 client를 가지고 구현을 했을 때에, http://주소/oauth2/authorization/kakao 를 a 태그에 넣었을 때 작동을 했다 그리고 /success 로 redirect해서, 응답 값을 프론트에 보냈다 BUT, 우리 프론트엔드 개발자 분은 Next.js를 사용했고, 위 주소를 axios, get으로 하면, 잘 안 돌아간다고 했다 프론트 측에도 로그인을 하는 로직이 따로 있다 http://주소/oauth2/authorization/kakao 를 redirection 없이 썼을 때는 응답값이 안 나오고 /success 로 re..
2024.01.11
-
[USports] Websocket 구현
[USports] Websocket 구현 build.gradle implementation 'org.springframework.boot:spring-boot-starter-websocket' implementation 'org.webjars:sockjs-client:1.1.2' implementation 'org.webjars:stomp-websocket:2.3.3-1' WebSocketConfig @Configuration @EnableWebSocketMessageBroker // STOMP를 사용 안 하고 EnableWebSocket으로 사용할 수 있다 public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Overri..
2023.12.25
-
[USports] Websocket 소개
[USports] Websocket 소개 HTTP 프로토콜 같은 경우 클라이언트가 요청을 보내고, 보낸 요청을 서버에서 응답을 하는 방식이다 웹에서 이루어지는 데이터 교환의 제일 기초적인 단계다 하지만 요청을 하고 응답을 하는 하나의 사이클이 끝나면, 클라이언트와 서버간의 연결은 끝나게 된다 example 클라이언트가 https://www.naver.com 을 서버에 요청을 한다 서버는 해당 페이지를 찾아서 응답을 해준다 클라이언트가 페이지를 받으면 클라이언트와 서버의 연결 상태는 끊기게 된다 즉 주식 정보, 비트코인 정보 같이 실시간으로 봐야하기 위해서는 새로 고침을 계속 눌러야 할 것이다 즉 실시간 데이터를 받기 위해 여러 방법이 있다 Polling & Long Polling Polling 같은 경우..
2023.12.18
-
[USports] Member OAuth2
[USports] Member OAuth2 Member를 만들고, 간편 인증이 필요할 것 같아 OAuth2를 사용하였다 그 중에 카카오 간편 로그인을 먼저 사용했다 OAuth란? 항상 간편 로그인을 위해서 사용되는 프로토콜인 줄 알았다 OAuth를 공부하면서 느낀 것 Resource Server, 즉 카카오나 네이버 같이 많은 사람들이 이미 회원가입을 한 어플리케이션에서, Client, 내 어플리케이션에게 자신들의 자원을 사용할 수 있는 권한을 주는 것이라고 크게 느꼈다 Resource Owner : 자원을 소유하는 사람 (예. 유저들) Resource Server : Resource Owner의 정보가 저장되어 있는 서버 (예. 카카오, 네이버) Client : Resource Server에 저장되어 ..
2023.12.09
-
[USports] Member 단위 테스트
[USports] Member 단위 테스트 Mock 서비스를 테스트 할 때에 필요한 외부 클래스들을 넣었다 repository, passwordEncoder 등 MemberServiceImpl에 넣었던 클래스들을 Mock으로 넘겼다 InjectMocks Mock으로 설정했던 클래스들을 MemberServiceImpl에 넣는 것이다 Nested 테스트들을 단위별로 묶을 수 있다 예를 들어, 로그인 테스트, 회원가입 테스트 별로 나누고, 그 안에 성공 케이스와 실패 케이스를 넣을 수 있다 when, thenReturn 주로 메서드 내에 repository를 사용하던지, 또는 Mock으로 설정된 클래스를 사용할 때에 when을 사용한다. 그리고 thenReturn을 통해서 when에서 불러온 메서드를 통해 어..
2023.12.07
-
[USports] Email 전송
[USports] Email 전송 프로젝트에서 이메일 인증과, 임시 비밀번호를 이메일을 통해 는 것이 있다 구글 SMTP 서버를 이용하였다프로젝트 용 이메일을 새로 만들고, 프로젝트를 위해, 원래 비밀번호가 아닌, 프로젝트 용 비밀번호를 개인 설정에서 받을 수 있다 하기 전에 2차 인증까지 설정을 해야 한다! Google 계정 관리에 들어가기검색에서 앱 비밀번호를 치고, 들어가기그러면 계정 비밀번호를 입력하라고 뜬다 App Name에 어플리케이션 이름 입력하기 앱 비밀번호를 받고, 꼭 복사하기 (잊어버리면, 또 다시 앱을 입력해야 한다)그리고 외부에 노출하지 말기! Gmail의 설정에 들어가서 전달 및 POP/IMAP에 들어가기 아래와 같이 설정하기 build.gradle아래 추가implementati..
2023.12.06
-
[USports] Login 구현
[USports] Login 구현 MemberController 로그인 로그인을 하면 access token과 refresh token을 받게 된다 MemberDto에 UserDetail을 넣어 활용했다 memberService.loginMember()에서는 간단하게 비밀번호가 일치하는지 그리고 유저가 DB에 존재하는 확인하면 된다 확인 후 MemberDto를 리턴하고, tokenProvider.saveTokenInRedis() 를 진행한다 재발급 access token이 만료되었을 경우 reissue, 재발급을 통해 refresh token과 access token을 받게 된다 tokenProvider.regenerateToken(refreshToken) 을 통해 재발급을 진행 로그아웃 로그아웃을 하면..
2023.12.05
-
[USports] Redis + Login
[USports] Redis + Login Redis https://jejoonlee.tistory.com/376 스프링 캐시 스프링 캐시 캐시 임시로 데이터를 저장하는 공간이다 인메모리가 될 수 있고, 서버에 캐시를 만들 수 있다 빠른 처리 속도로 성능을 향상할 수 있다 이미 조회한 데이터를 임시로 저장하고, 다 jejoonlee.tistory.com 예전에 레디스에 관련해서 살짝 다뤘던게 기억이 난다. 레디스는 NoSQL로 Key-Value로 데이터를 저장하는 메모리 데이터 스토어다. 해당 기능을 사용했을 때에 Key와 Value를 넣으면서, 해당 메모리에 대한 만료 기간도 넣을 수 있었다. 로그인과 레디스? 로그인을 할 때에 access token을 클라이언트에 준다 access token은 해당 ..
2023.12.05
-
스프링 회원기능
스프링 회원기능 회원기능을 구현하는 방법은 크게 Session과 Token 방법이 있다 Session 토큰 방식 (JWT) 로그인 구현 클라이언트가 로그인을 하게 되면, 서버에서는 클라이언트에게 권한을 부여한다 여기서 권한, 입장권 같은 내용을 가지고 서버에서 권한이 필요한 기능이면, 해당 입장권을 통해 그 기능을 클라이언트가 사용할 수 있게 된다 Session vs Token 세션은 따로 메모리나 DB에 로그인한 내용을 저장한다 즉 클라이언트가 요청을 보낼 때 마다, DB를 계속 확인을 해야 한다 유저가 늘어나면 서버에 부하가 일어날 수 있다 토큰은 세션보다 입장권 내용에 더 많은 내용들이 들어가 있다 서버에서는 토큰만 확인을 하면 된다 JWT (Json Web Token) Header 토큰의 타입 (..
2023.11.17
-
[MovMag] WebClient
[MovMag] WebClient 처음에는 외부 API를 통해서 JSON 파일로 파싱을 해서 데이터를 가지고 왔다 RestTemplate이라는 라이브러리를 추천 받았다 하지만, Spring 문서에서는 Spring 5.0에서부터는 RestTemplate보다는 WebClient를 사용하라고 권고하고 있다 NOTE: As of 5.0 this class is in maintenance mode, with only minor requests for changes and bugs to be accepted going forward. Please, consider using the org.springframework.web.reactive.client.WebClient which has a more modern A..
2023.11.06
-
[MovMag] ElasticSearch + MySQL
[MovMag] ElasticSearch + MySQL 참고한 블로그!!! https://backtony.github.io/spring/elk/2022-03-02-spring-elasticsearch-2/ 해당 프로젝트에서는 영화 DB를 TMDB API에서 가지고 와서 MySQL에 저장을 해 놓은 상태다 ElasticSearch는 DB가 아닌 검색 엔진이기 때문에, MySQL에 저장되어 있는 포멧을, ElasticSearch 포멧으로 바꿔놔야 한다 스프링에서는 Entity를 통해서 DB와 연결을 했다면, ElasticSearch는 Document를 사용한다 한 프로젝트 안에 Entity와 Document 두 개를 정확해 어노테이션을 통해 명시를 해야 한다 하드 코딩으로 Document를 만들지 않고, E..
2023.11.03
-
[MovMag] ElasticSearch setup
[MovMag] ElasticSearch setup 엘라스틱서치? 처음에는 query문을 통해서 원하는 내용을 출력하려고 했다 like 문을 사용할 수 있지만, 데이터가 너무 많을 때에는 찾는 속도가 느려질 수 있다 현재 만들고 있는 MovMag 이라는 영화 리뷰 API 자체에서, DB에 저장한 영화 개수만 10,000개가 넘고, 캐스트 수는 100,000명이 넘었다 엘라스틱서치는 DB는 아니지만, 방대한 양의 데이터를 신속하고 거의 실시간으로 저장, 검색, 분석할 수 있다 ELK (ElasticSearch / Logstatsh / Kibana) 단독으로 ElasticSearch를 사용하여 검색 기능을 구현할 수 있다 ElasticSearch : 분석 및 저장 기능을 담당 Logstatsh : 수집 기능..
2023.11.02
-
[MovMag] 20231031 오늘 배운 것 (@Asnyc)
[MovMag] 20231031 오늘 배운 것 @Async TMDB 오픈 API를 가져올 때, 너무 많은 데이터를 가져오는 탓에 데이터를 수집하는 속도가 느렸다 500 페이지의 영화 (한 페이지 당 20개) => 10,000개 캐스트 정보 (한 영화를 만들기 위해 많은 사람들이 필요하다) : 163,404명 동기적으로 할 때에는 예측할 때에는 1시간에 약 120페이지의 데이터를 저장할 수 있었다 비동기를 사용하여 데이터를 가지고 왔을 때, 10분 안에 50페이지의 데이터를 저장했음 (1시간 안에 저장) AsnycConfig @EnableAsync @Configuration public class AsyncConfig implements AsyncConfigurer { @Override public Exe..
2023.10.31
Python 프로젝트
-
클래스 카드 소개
클래스 카드 소개 프로젝트 기간 : 2022.11.23 ~ 2022.12.15 팀원 : 김나현 (팀장), 이제준, 김지연, 김지영, 임수경 맡은 역할 : 풀스택 개발, Readme 문서 정리 댓글, 대댓글 비동기 구현 카드 디테일 페이지 구현 (기능, UI) 카드 비교 기능 구현 맞춤 카드 추천 페이지 구현 (기능) 사용 도구 : Python (Django), JavaScript | HTML, CSS | Github | AWS 내용 : 사회 초년생을 위한 카드 혜택 정보를 제공하는 웹사이트 제작 크롤링을 통해 시중에 나와있는 카드 정보 수집 (FEAT. 카드 고릴라) 카드 정보, 카드 비교, 카드 추천, 그 외에도 카드 관련 커뮤니티 기능을 구현 코드 링크 : https://github.com/Class..
2023.02.26
-
클래스 카드 - Selenium
클래스 카드 - Selenium ✍️ Selenium을 통한 크롤링 Selenium을 이용하여 크롤링을 진행했다 카드 디테일 페이지를 하나씩 돌면서, 안에 있는 상세 정보들을 CSS_SELECTOR를 통해 가지고 왔다
2023.02.26
-
클래스 카드 - 카드 비교
클래스 카드 - 카드 비교 카드 비교 모델 (Model) class CompareCard(models.Model): card = models.ForeignKey(Card,on_delete=models.CASCADE) user = models.ForeignKey(get_user_model(),on_delete=models.CASCADE) 로그인을 해야 카드 비교 기능을 사용할 수 있다 그래서 유저 정보를 가지고 오고, card 정보를 통해서 카드를 카드 비교함에 넣는 것이다 여기서 user마다 카드는 최대 3개까지 카드 비교함에 넣을 수 있다 카드 비교함에 카드 넣기 (요청) # 카드를 비교하기 위해서 비교하기 바구니에 넣고 / 비교하기 페이지 path('bookmark//', views.b..
2023.02.26
-
클래스 카드 - [UI설명] 카드 디테일 페이지
클래스 카드 - 카드 디테일 페이지 카드 디테일 페이지는 카드 데이터부터, 시각화까지 모든 것을 구현했다 카드 데이터 크롤링을 통해 카드 데이터를 가지고 왔다 카드 이름 / 카드사 혜택 등 페이지 구현 제일 중요하게 생각한 것이, 어떻게 하면 유저들에게 간단한 UI를 제공하고 싶었다 그래서 정말 중요한 카드 내용들은 페이지에서 보여주었다 그리고 주요 혜택 같이, 내용이 많은 것들은, 모달을 이용했다 주요 혜택의 제목 그리고 간단한 설명을 카드와 카드 호버 기능을 통해 구현을 했다 해당 카드를 누르면, 모달창이 뜨고, 주요 혜택에 대한 자세한 정보를 볼 수 있다 위와 같이 페이지를 만들어, 유저들이 한 눈에 카드에 대한 내용을 볼 수 있다 만약 주요 혜택이 궁금하면, 카드를 클릭하면 된다 주로 주요 혜택을..
2023.02.26
-
산메 (산책 메이트) 소개
산메 (산책 메이트) 소개 프로젝트 기간 : 2022.11.10 ~ 2022.11.21 팀원 : 최준혁 (팀장), 이제준, 김다솔, 간정진, 신우철 맡은 역할 : 풀스택 개발, Readme 문서 정리 지도 기능 구현 (기능, UI) 공원 검색 기능 구현 (기능, UI) 댓글 비동기 기능 구현 (기능, UI) 커뮤니티 디테일 페이지, 구현 (기능, UI) 사용 도구 : Python (Django), JavaScript | HTML, CSS | Github | AWS 내용 : 가까운 공원을 찾아주고, 공원에서 같이 산책을 할 수 있도록 친구 모집을 할 수 있는 커뮤니티 웹서비스 코드 링크 : https://github.com/jejoonlee/Sanme 개인적인 후기 : 매우 아쉬운 프로젝트였다. 처음 지도..
2023.02.26
-
산메 (산책 메이트) - 지도 구현기능
산메 (산책 메이트) - 지도 구현기능 지도 기능 설명 공공 데이터 포털에서 도시공원 정보를 CSV 파일로 다운로드 받았다 받고 난 후, 로컬 DB에 저장을 하여 공원 정보와 카카오 map API를 연결시켰다 '내 위치'를 누르면, 현재 내가 있는 주소의 IP 주소를 트래킹하여 나의 위치를 가지고 온다 그 위치를 기반으로 5km 반경에 있는 공원들을 표시한다 공원 검색 기능은, 공원 이름 또는 주소 기반으로 검색을 한다 검색을 하면 내 위치로 기본적으로 이동하고, 내 위치에서 제일 가까운 순으로 나열이 된다 공원 마커 클릭 마커를 클릭하게 된다면 마커 위에 해당 공원에 대한 정보가 간략하게 나온다 그리고 마커에서 '산책하기' 를 클릭하면, 해당 공원의 좌표와 함께 산책하기 모집 생성 페이지로 간다 Kak..
2023.02.26
-
여행 석사 - 소개
프로젝트 기간 : 2022.10.30 ~ 2022.11.07 팀원 : 감동재 (팀장), 이제준 (임시 팀장), 지현식, 조수람 맡은 역할 : 풀스택 개발, Readme 문서 정리 사용 도구 : Python (Django), JavaScript | HTML, CSS | Github 내용 : 국내 여행이 증가함에 따라, 사람들끼리 여행 정보를 공유하고, 소통할 수 있는 사이트 코드 링크 : GitHub - jejoonlee/Travel_Master_Semi_pjt GitHub - jejoonlee/Travel_Master_Semi_pjt Contribute to jejoonlee/Travel_Master_Semi_pjt development by creating an account on GitHub. git..
2023.02.22
-
여행석사 - Pagination 기능
검색 기능 - Pagination (페이지네이션) Search의 모델 class Search(models.Model): # 검색할 때, 받는 필드 title = models.CharField(max_length=10) # 인기 검색어를 위해 필요한 필드 count = models.PositiveIntegerField(default=0) views.py의 검색 기능 def search(request): popular_list = {} if request.method == "GET": search = request.GET.get("searched", "") sort = request.GET.get("sorted", "") if not search.isdigit() and not search == "": if..
2023.02.22
-
여행석사 - 검색 기능
검색 기능 - 검색 기능 Search의 모델 class Search(models.Model): # 검색할 때, 받는 필드 title = models.CharField(max_length=10) # 인기 검색어를 위해 필요한 필드 count = models.PositiveIntegerField(default=0) views.py의 검색 기능 def search(request): popular_list = {} if request.method == "GET": search = request.GET.get("searched", "") sort = request.GET.get("sorted", "") if not search.isdigit() and not search == "": if Review.object..
2023.02.22
-
여행 석사 - 인기 검색어 기능
검색 기능 - 인기 검색어 기능 Search의 모델 class Search(models.Model): # 검색할 때, 받는 필드 title = models.CharField(max_length=10) # 인기 검색어를 위해 필요한 필드 count = models.PositiveIntegerField(default=0) views.py의 검색 기능 def search(request): popular_list = {} if request.method == "GET": search = request.GET.get("searched", "") sort = request.GET.get("sorted", "") if not search.isdigit() and not search == "": if Review.ob..
2023.02.22
-
여행 석사 - 검색 결과 정렬 기능
검색 기능 - 정렬 기능 기능 Search의 모델 class Search(models.Model): # 검색할 때, 받는 필드 title = models.CharField(max_length=10) # 인기 검색어를 위해 필요한 필드 count = models.PositiveIntegerField(default=0) views.py의 검색 기능 def search(request): popular_list = {} if request.method == "GET": search = request.GET.get("searched", "") sort = request.GET.get("sorted", "") if not search.isdigit() and not search == "": if Review.obj..
2023.02.22
-
여행석사 - 댓글 비동기 기능
댓글 쓰기, 수정하기, 삭제하기 비동기 기능 비동기를 구현할 때에는, HTML 문서 안에, 어느 부분을 비동기 처리하고 싶은지, 큰 틀을 먼저 정하는 것이 중요하다. 댓글 비동기 댓글 삭제 비동기 댓글 수정 비동기
2023.02.22
Java
-
[Java] Open API와 JSON 활용하기
[Java] Open API와 JSON 활용하기 서울 공공 WIFI Open API 가져오기 https://data.seoul.go.kr/dataList/OA-20883/S/1/datasetView.do 위 주소를 통해서 API를 사용하기 위한 key와 사용법에 대해 읽는다 Open API 사용하기 PDF 파일에는 프로그래밍 언어마다 API를 사용하는 코드가 다 나와 있어서, 복사 붙여 넣기만 하면 된다 JSON 활용하기 JSON 라이브러리를 다운로드 받는다 https://code.google.com/archive/p/json-simple/downloads File -> Project Stucture -> Dependencies -> + -> 라이브러리 선택 코드 package test; import o..
2023.08.07
-
[TIL] Java (정렬)
[TIL] Java (정렬) Arrays.sort(배열) 배열을 오름차순으로 정렬을 해준다 배열이 문자열로 이루어져 있으면, 숫자 => 대문자 => 소문자 => 한글순 으로 정렬이 된다 import java.util.*; public class Main { public static void main(String[] args) { String[] string = {"C", "A", "a", "B", "b", "7", "제", "준", "기", "5", "9", "1"}; Integer[] num = {3, 4, 8, 1, 2, 3}; Arrays.sort(string); Arrays.sort(num); System.out.println("=== 오름차순 정렬 ==="); System.out.println(..
2023.06.28
-
[TIL] Java (진수 변환)
[TIL] Java (진수 변환) 10진수 => 16진수 or 8진수 or 2진수 변환 Integer.toBinaryString(십진수) 10진수에서 2진수로 변환 Integer.toOctalString(십진수) 10진수에서 8진수로 변환 Integer.toHexString(십진수) 10진수에서 16진수로 변환 public class Main { public static void main(String[] args) { int number = 77; System.out.println(Integer.toBinaryString(number)); // output : 1001101 System.out.println(Integer.toOctalString(number)); // output : 115 System..
2023.06.24
-
[TIL] Java (Split, Join)
[TIL] Java (Split, Join) split 은 문자열을 배열로 바꿔준다 .split(String regex) 해당 문자열 (regex) 을 바탕으로 문자열을 잘라서 배열에 넣어준다 .split(String regex, int limit) 해당 문자열 (regex) 을 바탕으로 문자열을 잘라서 배열에 넣어주지만, limit만큼 잘라준다 "|" 을 사용하여, 여러 구분자를 사용할 수 있다 이미 ^, * 같은 연산자를 구분자로 사용하고 싶을 때에는 \\^ 또는 \\* 처럼 앞에 \\을 추가해주면 된다 import java.util.*; public class Main { public static void main(String[] args) { String string = "JeJoon,Alex,M..
2023.06.23
-
[TIL] Java (Regex)
[TIL] Java (Regex) Regex란? Regular Expression으로 특정 패턴을 찾아서, 문자를 찾거나 교체를 할 수 있다 예를 들어, 전화번호 형태로 입력을 안 하면, 뒤로 못 넘어갈 수 있도록 만들 수 있다 또는 한국어로만 입력이 가능하게 설정을 할 수 있다 Regex는 java.util.regex.* 를 통해서 사용이 가능하다 클래스 Pattern Class : 문자를 찾을 때에, 특청 패턴을 정의한다 Matcher Class : 패턴을 찾을 때에 사용한다 PatternSyntaxException Class : 정규식 (Regular Expression)에 에러를 보여준다 예시 if (Pattern.matches("^[ㄱ-ㅎ가-힣]*$", candidateName) == true)..
2023.06.12
Python
-
Python 좌표계
📋Python 좌표계 좌표계는 동근 지구를 2차원 평면에 투영하는 다양한 방법이다 주로 위도, 경도 (Latitude, Longitude)를 사용한다 대표적으로 ESPG:4326 / WGS84 이 있다 하지만, 한국에서 사용하는 특정 데이터에서, x와 y를 통해 위치를 찾는 것을 볼 수 있게 되었다 이것을 ESPG:5181 이고 카카오나 공공데이터포탈에서 자주 사용한다 개인적으로는 위도, 경도가 익숙해서, 공공데이터포탈에서 가지고 온 x,와 y 좌표를 위도와 경도로 변환하는 방법을 찾았다 아래는 pyproj 버전이 업데이트 하기 전이다 from pyproj import Proj, transform epsg5181= Proj(init="epsg:5181") wgs84=Proj(init='epsg:4..
2023.04.19
-
Udemy : Python Flask / 터미널 명령어 / `__name__` `__main__`
Udemy : Python Flask / 터미널 명령어 / __name__ __main__ Udemy Python Flask 파이썬 기반 프레임워크다 장고보다 소규모의 웹 개발을 할 때에 사용한다 백엔드 클라이언트, 서버, DB, 세 요소가 맞물려 백엔드를 작동시킨다 클라이언트 브라우저를 이용하는 사용자 서버 사용자의 요청 사항을 받을 준비가 되어 있는 곳 DB 사이트의 모든 정보를 담아두는 곳이다 즉 클라이언트에서 서버로 요청을 보낸다 서버에서 클라이언트가 요청한 데이터를 찾아서 클라이언트에 응답을 해준다 Flask 시작하기 from flask import Flask app = Flask(__name__) @app.route("/") def hello_world(): return "Hello, Worl..
2023.02.27
-
Udemy : Python Selenium
Udemy : Python Selenium Udemy Python Selenium Webdriver 웹에서 자동적으로 작업을 할 수 있도록 만드는 것 입력, 클릭, 스크롤 등 인간들이 웹에서 할 수 있는 것들을 자동으로 할 수 있다 Selenium 크롬 설치하기 셀레니움/ webdriver 설치하기 pip install selenium 그리고 pip install webdriver_manager 설치하기 webdriver.Chrome(service=Service(ChromeDriverManager().install())) 예전에는 크롬드라이버를, 크롬 버전에 따라서, 직접 다운로드를 받아야 했다 하지만 이제는 service=Service(ChromeDriverManager().install())를 통해 ..
2023.02.19
-
Udemy : Python 스포티파이 재생목록
Udemy : Python 스포티파이 재생목록 설명 팝 음악 기간별 톱 100 차트를 통해서 음악 100개 가지고 오기 스포티파이 uri로 트랙들을 저장하여, 스포티파이의 플레이 리스트에 음악 넣기 from bs4 import BeautifulSoup import requests import os import dotenv dotenv.load_dotenv() date = "20100217" # input("Which year do you want to travel to? Type the date in this format YYYYMMDD: \n") response = requests.get( f"https://www.officialcharts.com/charts/singles-chart/20140216/..
2023.02.15
-
Udemy : Python Web Scraping (parsing)
Udemy : Python Web Scraping (parsing) Web Scraping 웹 사이트의 html을 사용하여, 웹 사이트에 있는 데이터를 가지고 오는 것이다 웹 스크래핑은 합법인가? 웹 스크래핑은 내 소유가 아닌 다른 사람의 소유의 웹 사이트의 데이터를 사용하는 것이다 주로 저작권이 없거나, 로그인 없이 접근할 수 있을 때에 데이터를 사용할 수도 있다 웹 스크래핑을 한 데이터를 상업화 하면 불법이 될 수 있다 저작권이 있는 데이터를 상업화 시키는 것도 불법이다 웹 사이트에 로그인을 하여, 웹 스크래핑을 할 경우 불법이다 로그인을 해서 데이터를 활용할 수 있는 웹 사이트들은, 회원가입 때에, 해당 사이트의 데이터를 못 쓰도록 인증하도록 되어 있다 웹 스크래핑을 막기 위해 사용되는 도구다 데이..
2023.02.14
Javascript
-
Udemy - Node.js [JavaScript Basics]
Udemy - Node.js [JavaScript Basics] Node.js - The Complete Guide (Udemy) Node.js 란? 자바스크립트의 실행시간이다 자바스크트는 브라우저에서 실행되는 언어로, DOM을 조작하거나 브라우저에 로드된 페이지를 조작하는 프로그래밍 언어다 DOM = Document Object Model 자바스크립트를 서버에서 실행할 수 있도록 해준다 JavaScript on the Server 브라우저에 직접적으로 나타나지 않는, 데이터베이스를 연결하거나, 사용자 인증, 입력 유효성 검사까지 서버에서 한다 JavaScript Basics Boolean, 숫자, 텍스트 같이 데이터를 명확하게 정의하도록 강요하지 않는다 숫자를 텍스트로 바꾸는 것과 같이, 데이터 typ..
2023.04.06
-
Udemy - Javascript - Graph Traversal
Udemy - Javascript - Graph Traversal Udemy JavaScript 그래프 순회 그래프에 있는 모든 노드들을 방문할 필요까지는 없다 그래프 순회를 할 때에는 visiting / updating / checking 이 중요하다 깊이 우선 그래프 (Depth First) vertex의 이웃 중 방문하지 않은 하나의 이웃으로 가는 것이다 이것을 모든 Vertex를 방문할때까지 순회를 한다 더 작은 이웃을 기준으로 깊이 우선 순회하기 넓이 순회 (Breadth First) 이웃된 노드가 2개면, 그 2개를 모두 순회하며 그래프를 순회한다 기본 그래프 만드는 코드 Graph 클래스에 DFS와 BFS를 넣을 것 class Graph { constructor(){ this.adjacenc..
2023.02.27
-
Udemy - Javascript - Graph
Udemy - Javascript - Graph Udemy JavaScript 그래프 그래프는 유한하고 변할 수 있는 꼭지점이나 노드나 점들의 집합으로 구성된 데이터 구조다 그래프는 노드나 노드들의 연결을 모은 것이다 이진 트리와 다르게, 노드들끼리 연결만 되어 있으면 된다 그래프의 쓰임새 소셜 네트워크 좌표 / 지도 라우팅 알고리즘 (Routing Algorithms) 시각적 위계 (Visual Hierarchy) 등등 그래프의 유형 vertex : 노드 edge : 노드와 노드의 연결하는 선 Directed / Undirected Graph Undirected Graph : 특정한 경로가 없이, 두 노드 사이에서 왔다갔다 할 수 있다 / 방향이 없음 Directed Graph : edge마다 방향이 ..
2023.02.24
-
Udemy - Javascript - Hash Table
Udemy - Javascript - Hash Table Udemy JavaScript 해시 테이블 해시 테이블은, key와 value의 집합들이다 해시 테이블의 key들은 정렬이 안 되어 있다 파이썬에서는 Dictionary로 불린다 배열과 달리, 해시 테이블은, 요소를 찾을때, 삭제할 때, 새로운 요소를 추가할 때에 매우 빠르다 속도 때문에 해시 테이블을 많이 사용한다 해시 함수 key를 index같이 활용하고, value를 buckets 안에 넣는 것이다 key를 넣을때마다, key는 buckets의 특정 인덱스에 넣어지게 된다
2023.02.23
-
Udemy - Javascript - Binary Heaps
Udemy - Javascript - Binary Heaps Udemy JavaScript 이진 힙 MaxBinaryHeap : 부모 노드가 항상 자식 노드보다 크다 MinBinaryHeap : 부모 노드가 항상 자식 노드보다 작다 이진 힙은 항상 오른쪽과 왼쪽의 자식 노드를 채운다 MaxBinaryHeap 에서는 루트 노드가 제일 커야 한다 각 노드는 최대 2개의 자식을 가지고 있다 같은 층에 있는, 자식들은 부모 노드보다 작거나 큰거지, 서로의 관계는 상관이 없 인덱스 0의 자식은 1, 2 인덱스 1의 자식은 3과 4 인덱스 2의 자식은 5와 6 인덱스 3의 자식은 7, 8 즉 인덱스 n의 자식 노드를 구할 때에는 왼쪽 노드는 2n + 1 오른쪽 노드는 2n + 2 반대로 부모 노드를 구할 때에는 (..
2023.02.22
알고리즘
-
[Java] DFS
[Java] DFS 전위 순회 class Solution { public void DFS(int v) { if (v > 7) return; else { System.out.print(v + " "); DFS(v * 2); DFS(v * 2 + 1); } } public static void main(String[] args) { Solution T = new Solution(); T.DFS(1); } } // return : 1 2 4 5 3 6 7 중위 순회 class Solution { public void DFS(int v) { if (v > 7) return; else { DFS(v * 2); System.out.print(v + " "); DFS(v * 2 + 1); } } public stat..
2023.10.12
-
꼭 보기! 20231003 [Java] 문제풀이 (다익스트라 + dfs)
꼭 보기! 20231003 [Java] 문제풀이 (다익스트라 + dfs) [프로그래머스] 배달 - 다익스트라 다익스트라 알고리즘을 활용 1부터 시작하여, 모든 마을들에 갈 수 있는 최적의 거리를 계산 그 후, 1부터 시작하여 모든 마을들에 갈 수 있는 거리들을 순회하며, 답을 찾는다 import java.util.*; class Solution { static class Node { int to; int distance; Node(int to, int distance) { this.to = to; this.distance = distance; } } public int solution(int N, int[][] road, int K) { int answer = 0; int[] allDistances = ..
2023.10.03
-
20230925 [Java] 문제풀이
20230925 [Java] 문제풀이 [프로그래머스] 주식가격 그냥 2중 for문을 사용하여, prices에 있는 원소들을 서로 비교하면 되는 문제다 크거나 같으면 다음 prices 원소를 순회한다 작으면 바로 break class Solution { public int[] solution(int[] prices) { int[] answer = new int[prices.length]; for (int i = 0; i prices[j]) break; } answer[i] = count; } return ans..
2023.09.26
-
20230918 [Java] 문제풀이
20230918 [Java] 문제풀이 [프로그래머스] 프로세스 우선순위 큐를 사용해서 프로세스의 우선순위를 찾는다 여기서 우선순위 큐는 내림차순으로 만들어야 한다 그리고 큐에 priorities를 프로세스의 인덱스와 프로세스의 우선순위를 배열로 넣어준다 큐를 돌면서 우선순위가 같은 프로세스를 result 리스트에 넣어주고 우선순위 큐에서 해당 우선순위는 빼주고, 큐에서도 빼준다 큐를 돈다는 것은, 우선순위가 같지 않으면 큐의 맨 뒤로 돌아가게 된다 import java.util.*; class Solution { public int solution(int[] priorities, int location) { ArrayList result = new ArrayList(); PriorityQueue pq =..
2023.09.18
-
20230917 [Java] 문제풀이
20230917 [Java] 문제풀이 [프로그래머스] 소수 찾기 isNotSuso 배열에 0부터 9999999까지 수소의 여부를 true 또는 false로 설정한다 수소이면 false / 아니면 true 이다 permutation, 순열을 통해서 주어진 숫자에서, 만들 수 있는 모든 숫자들을 만든다 숫자들을 만들 때에 중복이 될 수 있기 때문에, set에 넣어준다 set에서 숫자들을 빼면서 수소인지 아닌지 인덱스를 통해서 개수를 센다 import java.util.*; class Solution { HashSet set = new HashSet(); boolean[] isNotSuso = new boolean[10000000]; int count = 0; public void permutation(Str..
2023.09.18
IT 기술
-
인공지능 - 뇌와 신경망 모델
인공지능 - 뇌와 신경망 모델 K-MOOC 인공지능 만들기 뇌와 컴퓨터 1943년 McCulloch & Pitts 는 사람 뇌의 신경세포들이 논리회로의 AND OR NOT 게이트 연산을 수행할 수 있다고 했다 즉 컴퓨터가 뇌처럼 계산하고 문제를 해결할 수 있다고 생각하기 시작했다 컴퓨터 빠르고 상당히 정확하다 (논리소자) 디지털 회로망 (전자 회로망) / 주소기반 메모리 (국지적 / 독립적) 어느 파일에서 어떤 것이 저장이 되어 있는지 꺼내서 사용을 한다 논리 / 산술적 연산 (조작적) 기호로 symbol을 정해 표현을 한 다음, 그것을 조작하여 추론을 한다 중앙집중식 순차 처리 프로그래밍기반 명시적 지식 지식을 넣을 수는 있지만, 학습을 못 하는 것이 단점이다 뇌 부정확하고 속도도 느리다 (신경세포) ..
2023.01.11
-
인공지능 - 지식 표현
인공지능 - 지식 표현 K-MOOC 인공지능 만들기 상식적 지식 기계가 인간들의 일반 상식을 가지게 할 수 있는지가, 아직 풀리지 않은 숙제이다 인간들에게는 너무나도 당연한 것은 기계들을 추론을 못 할 수 있다 예) 컵이 떨어지면, 컵이 깨진다는 인간들에게는 너무 당연한 것이다. 하지만 로봇은 아직 컵이 떨어지면, 컵이 깨진다는 추론을 못 할 수도 있다 지식 표현의 세 가지 방법 Semantic Network (의미망) 인공지능에서 지식 표현을 위한 그래프 구조 노드와 링크로 구성된 그래프 구조다 위 같은 경우 Jerry가 동물이란 것을 알기 위해, Jerry는 고양이라는 노드로 옮기고, 고양이는 mammal이라는 노드로 옮기고, 그리고 mammal은 동물이다 라는 노드까지 가야, Jerry가 동물이다 ..
2023.01.10
-
인공지능 - 규칙 기반 시스템
인공지능 - 규칙 기반 시스템 K-MOOC 인공지능 만들기 규칙 기반 시스템 규칙 형태로 된 표현을 써서 어떤 시스템을 모델링 하는 방법 지식 선언적 지식 사실, 문제 절차적 지식 방법, 쇼핑 절차 쇼핑을 할 때에 어떤 것을 살지 고르고, 계산하는 것 도메인 지식 추론의 대상, 구조, 관계 전략적 지식 추론하는 방법 어떤 추론 방법을 적용하는 것이 맞을까? 전문가 시스템 규칙 기반 시스템으로 인공지능 역사에서 산업화가 성공한 예 도메인 영역에서, 지식의 폭을 좁히고, 그 분야의 전문가의 많은 지식을 기계한테 넣는다 기계는 그 지식을 통해 추론을 한 후, 의사결정을 할 수 있도록 한다 Knowledge Base (KB) 지식 베이스 데이터 베이스에, 지식을 데이터화해서, 넣어둔 것 이 지식 (knowled..
2023.01.09
-
인공지능 - 논리, 사고, 지식
인공지능 - 논리, 사고, 지식 K-MOOC 인공지능 만들기 사고, 논리, 지식 인공지능이 인간의 사고 과정을 모사하는 방법 기호 논리를 이용하여 현실 세계를 모델링 한다 문제와 전제를 기술하는 것 논리 규칙을 적용한다. 문제를 추론하고, 결론을 만들어낸다 예시) 위에 상자들이 놓여 있다 이것을 인공지능은 논리 언어로 정리를 한다 세계 1 같은 경우 순서대로 B 상자 위에 비어 있다 (Clear) B는 A 위에 쌓여있다 (On) C 상자 위에는 아무것도 없다 (Clear) A 상자는 땅 위에 있다 (Floor) / C 상자는 땅 위에 있다 (Floor) 이처럼, 논리식으로 인공지능은 현실 세계를 표상(representation)한다 이러한 논리식을 가지고, 상자들의 움직이는 과정을 추론하고 생각할 수 있..
2023.01.05
-
인공지능 - 연구 분야
인공지능 - 연구 분야 K-MOOC 인공지능 만들기 인공지능 연구 분야 기능적 분류 지각 (Perception) 환경을 지각하는 능력 인지 (Cognition) 문제에 대해 생각하는 인지 능력 행동 (Action) 문제를 해결하기 위해 행동으로 옮겨 의사결정을 하는 것 과정적 분류 학습 (Learning) 데이터를 가지고 어떻게 학습을 하는가? 추론 (Reasoning), 표상 (Representation) 학습한 데이터를 가지고 어떻게 추론을 해서 문제를 풀 것인가? 탐색 (Search) 다양하고 새로운 문제를 풀면서, 어떤 해결책이 더 좋은지 탐색을 한다 계획 (Planning) 어떻게 탐색해서 목표에 달성할 것인지 계획을 한다 양상적 분류 주변을 이해하기 위해서 시각 (Vision) 능력을 가져야 ..
2023.01.04
글쓰기
-
백엔드 신입 개발자에게 자료구조와 알고리즘이란
백엔드 신입 개발자에게 자료구조와 알고리즘이란 제로베이스 백엔드 스쿨 나에게 자료구조, 알고리즘란? 자료구조 그리고 알고리즘을 배우면서, 제일 스트레스를 많이 받으면서, 그만큼 성취감이 제일 컸던 것 같다. 처음 파이썬으로 알고리즘을 배우고, 문제를 풀면서 파이썬이라는 언어에 더 익숙해질 수 있었다. 그만큼 나에게 자료구조, 그리고 알고리즘은 새로운 언어에 익숙해질 수 있는 촉진제 같은 역할을 했다. 알고리즘을 풀면서, 필요한 메서드나 클래스를 찾아가면서 문제를 풀어나갔다. 이렇게 알고리즘을 풀면서 사용했던 클래스나 메서드를 프로젝트에 사용하기도 했다. 그리고 실제로 자료구조를 잘 배워둬서, 나중에 프로젝트를 할 때에 더 편안하게 진행을 했던 부분도 있다. 파이썬은 많은 라이브러리가 있어서, 알고리즘을 ..
2023.07.05
-
앞으로의 백엔드 공부 계획
앞으로의 백엔드 공부 계획 제로베이스 백엔드 스쿨 매일 배운 내용, 풀었던 문제 정리해서 블로그에 올리기 성실하게 공부하기 다음 주가 되면, 개발을 배운지 딱 1년이 된다. 처음에는 깃헙에 커밋을 매일 하며, 잔디 심기에 빠져서, 매일 공부한 것을 깃헙에 올리거나 풀었던 문제를 커밋을 했다. 특히 개발을 배우면서, 나중에 내 자신이 배웠던 내용을 까먹었을 때에, 알아볼 수 있도록 다시 정리해 놓는 것이 중요하다고 느꼈다. 그렇게 느끼면서 매일매일 배웠던 내용을 내 자신일 잘 알아볼 수 있도록 정리를 했다. 특히, 새로운 코드를, 라인 하나하나 설명하면서 문서화 하는 작업이 익숙해졌고, 추후에 매우 유용하게 쓰이게 되었다. 그렇게 12월 말에, 깃헙보다는, 좀 더 제대로 정리를 하자는 생각에 티스토리에 글..
2023.06.29
-
나는 어떤 백엔드 개발자가 되고 싶은가?
나는 어떤 백엔드 개발자가 되고 싶은가? 제로베이스 백엔드 스쿨 풀스택 솔직히 처음 풀스택 개발을 배우면서 많이 혼란했다. 처음 개발을 배우는 입장에서, 백엔드도 재미 있었고 프론트엔드도 재미가 있었다. 이런 이유 때문에, 첫 6개월 교육 과정이 끝나고, 혼자서 공부할 때에 백엔드와 프론트엔드 사이에서 길을 잃어버린 느낌을 받았다. 그렇게 혼자서 4개월이라는 시간 동안 길 잃은 사람처럼 방황을 하다가, 아니다 싶어 취업 시장에 뛰어 들어갔다. 취업 시장에서는 프론트엔드와 백엔드 모두 지원을 했다. (프론트는 바닐라 자바스크립트만 배운 상태였다) 약간 마인드는, "둘 중에 취업한 쪽으로, 회사 다니면서 더 공부해야지" 였다. 당연히 취업은 안 되고, 자신감은 많이 떨어졌다. 백엔드 너무 자신감이 떨어지다 ..
2023.06.29
-
프론트엔드와 백엔드 차이
프론트엔드와 백엔드 차이 제로베이스 백엔드 스쿨 내 경험 멀티캠퍼스 풀스택 개발 과정을 배우며, 프론트엔드와 백엔드를 모두 경험할 수 있었다. 실제로 프로젝트를 할 때에 모두 풀스택으로 참여를 했다. 처음부터 기능을 구현하고, 구현한 기능을 시각화 하는 재미가 있었다. 혼자 모든 것을 구현하니, 시간은 걸렸지만, 성취감은 배로 쌓이게 되었다. 프론트엔드와 백엔드 차이 화면 프론트엔드는 화면으로 보여지는 것을 얘기한다. 프론트엔드 쪽을 다루며 UI/UX (User Interface / User Experience)에 대해 많이 들었다. 즉, 유저들이 해당 서비스를 사용할 때에, 직접적으로 상호 작용하는 부분이 프론트엔드이다. 좀 더 생각하면, 프론트엔드를 통해 새로운 유저를 유치하거나, 기존 유저들을 유지..
2023.06.12