eucis의 등록된 링크

 eucis로 등록된 네이버 블로그 포스트 수는 233건입니다.

데이터베이스 선정 과정 (RDBMS vs NoSQL) [내부링크]

NoSQL NoSQL은 "Not Only SQL"의 약자로, 관계형 데이터베이스가 가진 구조화된 쿼리 언어(SQL)에만 의존하지 않는 데이터 저장소의 총칭입니다. 이러한 데이터베이스는 대량의 분산된 데이터를 저장하고 관리하기 위해 설계되었으며, 관계형 데이터베이스 모델의 엄격한 구조 대신 더 유연한 데이터 모델을 사용합니다. NoSQL 데이터베이스는 크게 네 가지 주요 유형으로 분류됩니다: 문서 지향, 키-값 저장소, 컬럼 패밀리, 그래프 데이터베이스입니다. 문서 지향 데이터베이스는 JSON, BSON 같은 반구조화된 데이터 형식을 사용하여 문서를 저장하고, 이러한 문서들은 키에 의해 식별됩니다. MongoDB와 CouchDB가 이 범주에 속합니다. 키-값 저장소는 가장 단순한 형태의 NoSQL 데이터베이스로, 각 키에 하나의 값이 매핑되어 있으며, Redis와 DynamoDB가 여기에 해당합니다. 컬럼 패밀리 데이터베이스는 대규모 분산 시스템에 최적화되어 있으며, 데이터를 컬럼 기

[TDD] Google (new) Place API 연동 [내부링크]

이전에 공무원 업무 추진비 데이터를 기반으로 Google Place API에 연동하여 데이터를 가져오는 작업을 진행합니다. 그 중 텍스트 검색을 통해 장소 데이터를 가져올 예정입니다. 텍스트 검색(신규) | Places API | Google for Developers 이 페이지는 Cloud Translation API 를 통해 번역되었습니다. 홈 제품 Google Maps Platform 문서 웹 서비스 Places API 가이드 텍스트 검색(신규) 텍스트 검색(신규) 은 문자열(예: '뉴욕의 피자', '오타와 근처의 신발 가게' 또는 '중앙로 123')을 기반으로 장소 집합에 대한 정보를 반환합니다. 이 서비스는 텍스트 문자열과 일치하는 장소 목록 및 설정된 위치 편향으로 응답합니다. 이 서비스는 자동화 시스템에서 모호한 주소 쿼리 를 수행할 때 특히 유용하며, 문자열에서 주소가 아닌 구성요소... developers.google.com 텍스트 검색 요청 텍스트 검색 요청은 다음

Batch Scheduler [내부링크]

스프링 배치를 사용하면서 언제, 어떻게 호출하고 실행시킬지에 대한 고민을 해야 합니다. 배치는 일괄적인 처리를 위해서 단독으로 사용되기도 하지만 실제 업무에서는 스케줄러와 같이 사용되는 것을 자주 볼 수 있습니다. 그렇다면 스케줄러 이외에 어떤 경우에 배치를 호출할까요? 클라이언트가 특정 URL 주소를 접근하게 되었을 때에도 사용합니다. 코드 내 Controller에서 해당 Service를 호출하고 Service에 특정 Batch를 호출하여 사용합니다. 배치(Batch)라고 떠올리실 때 '특정 시간에 특정 작업을 하는 것'이라고 생각하시면 안 됩니다. 배치는 데이터들을 일괄적으로 처리하기 위한 작업이며, 특정 일자나 특정 시간에 맞춰 작업을 하는 것은 스케줄러(Scheduler)입니다. 배치를 실행하고 특정 테이블(A)에 영향을 미치게 된다면, 특정 테이블(A) 에 걸려있는 트리거(Trigger)가 실행되고 예상치 못한 결과를 가져오기도 합니다. 배치를 사용하는 것은 일관성을 보장해

2024 열린데이터광장 공공데이터 활용 창업경진대회 [내부링크]

data.seoul.go.kr "공무원 업무 추진비 기반 맛집 추천" 지도 기능: 카카오 지도를 활용하여 공무원들이 방문한 음식점의 위치를 마커로 표시합니다. 위치 정보와 대기 시간 등이 제공됩니다. 맛집 정보 제공: 각 가게의 상세 정보와 메뉴, 교통편, 키워드, 업무 추진비 내역 등을 제공합니다. 사용자 인터랙션: 사용자 리뷰, 좋아요 기능을 통해 맛집을 평가하고 비슷한 맛집을 추천받을 수 있습니다. 데이터 시각화: 방문자수, 매출순위, 좋아요 순위 등을 기반으로 한 맛집 랭킹을 시각화합니다. 맞춤형 추천: 가격대별, 분위기별, 목적별(예: 조용한 식사, 단체 모임) 식당을 추천합니다. 검색 기능: 카테고리별, 키워드별 검색이 가능하며, 세부 메뉴를 통해 다양한 통계 정보에 접근할 수 있습니다. 전체 스토리보드 사용 예상 데이터 공무원 업무추진비 서울시 본청 업무추진비 목록 서울시는 업무추진에 대한 비용집행의 투명성을 제고하고자, 시장단을 비롯하여 4급 부서장 이상 공무원의 업무

[TDD + SpringBatch] 공무원 업무 추진비 Open API 연동 [내부링크]

서울시는 공무원 업무 추진비의 투명성을 높이기 위해, 시장단부터 4급 부서장 이상의 공무원까지 업무 추진비 사용 내역을 공개합니다. 이 정보는 공무원 업무 추진비 Open API를 통해 접근할 수 있으며, data.seoul.go.kr에서 제공됩니다. 서울시 본청 업무추진비 목록 서울시는 업무추진에 대한 비용집행의 투명성을 제고하고자, 시장단을 비롯하여 4급 부서장 이상 공무원의 업무추진비 집행내역을 공개합니다. data.seoul.go.kr 요청인자 출력값 데이터셋 분석 데이터셋을 분석하는 과정에서 전체 데이터가 57,000페이지에 걸쳐 있는 것을 확인했습니다. 이 데이터를 모두 합치면 총 57,000개의 정보가 있는 것으로 나타났습니다. 이와 같은 대규모 데이터셋을 효율적으로 처리하기 위해, 간단한 방법보다는 체계적이고 효율적인 접근이 필요합니다. 이런 이유로, 대용량 데이터 처리에 강점을 지닌 Spring Batch를 사용하기로 결정했습니다. Spring Batch는 대규모 데

AWS Cloud Practitioner Essentials - QUIZ [내부링크]

Module 1: INTRODUCTION TO AMAZON WEB SERVICES What is cloud computing? A. Backing up files that are stored on desktop and mobile devices to prevent data loss B. Deploying applications connected to on-premises infrastructure C. Running code without needing to manage or provision servers D. On-demand delivery of IT resources and applications through the internet with pay-as-you-go pricing The other response options are incorrect because: It is possible to back up files to the cloud, but this respo

2024-03-11 ~ 2024-03-17 사이의 주요 뉴스 [내부링크]

2024년 3월 11일부터 17일 사이에는 다양한 기술 뉴스가 있었습니다. 대규모 트래픽을 처리하는 서비스의 증가로 인해 복잡한 아키텍처에 대한 시도와 논쟁이 이어졌고, 아프리카의 모바일 뱅킹 서비스인 Wave가 단순한 아키텍처를 통해 큰 성공을 거두었다는 이야기가 나왔습니다. 이는 단순함이 복잡성을 최소화하고 문제 해결에 집중하는 데 도움을 줄 수 있음을 보여줍니다. 또한, Git이 개발 도구로서 필수적이지만 제대로 배우지 못하는 상황과 페이스북 및 구글이 Git을 사용하지 않는 이유에 대한 글이 공유되었습니다. 특히, 페이스북이 Mercurial을 선택한 배경에는 기술적 이유보다는 사람과의 관계가 중요한 역할을 했다는 점이 강조되었습니다. 마지막으로, Figma의 데이터베이스 팀이 Postgres 스택을 활용해 규모 확장을 성공적으로 이뤄낸 과정에 대한 내용도 있었습니다. 이는 기술적 도전과 해결 방안에 대한 귀중한 정보를 제공합니다.

Transport Protocol(1) - TCP [내부링크]

TCP 패킷 사이의 순서를 보장하고 연결지향 프로토콜을 사용해서 연결을 하여 신뢰성을 구축해서 수신 여부를 확인 ‘가상회선 패킷 교환 방식’을 사용 TPC 3 way handshak 본격적으로 상대 클라이언트와 연결되기 전에 가상 연결을 해서 패킷으로 보내서 확인하는 동작이다. SYN : 접속 요청 ACK : 요청 수락 이름 의미 SYN 연결을 생성할 때 클라이언트가 서버에 시퀀스 번호를 보내는 패킷 SYN-ACK 시퀀스 번호를 받은 서버가 ACK 값을 생성하여 클라이언트에게 응답하는 패킷 ACK ACK 값을 사용하여 응답하는 패킷 [STEP 1] A클라이언트는 B서버에 접속을 요청하는 SYN 패킷을 보낸다. 이때 A클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는SYN_SENT 상태가 되는 것이다. [STEP 2] B서버는 SYN요청을 받고 A클라이언트에게 요청을 수락한다는 ACK 와 SYN flag 가 설정된 패킷을 발송하고 A가 다시 ACK으로 응답하기를 기다린다.

Transport Protocol(2) - UDP [내부링크]

UDP(User Datagram Protocol) UDP는 비연결형 프로토콜이다. ※ 연결을 위해 할당되는 논리적인 경로가 없고, 각각의 패킷은 다른 경로로 전송되며, 독립적인 관계를 지닌다. UDP의 특징 1. 비연결형 서비스로 데이터그램 방식을 제공한다. 데이터의 전송 순서가 바뀔 수 있다. 2. 데이터 수신 여부를 확인하지 않는다. TCP의 3-way handshaking과 같은 과정 X 3. 신뢰성이 낮다. 흐름 제어(flow control)가 없어서 제대로 전송되었는지, 오류가 없는지 확인할 수 없다. 4. TCP보다 속도가 빠르다. 5. 1:1 & 1:N & N:N 통신이 가능하다. (1). UDP는 비연결형 서비스이기 때문에, (2). 연결을 설정하고 해제하는 과정이 존재하지 않는다. 서로 다른 경로로 독립적으로 처리하며, (3). 흐름 제어 또는 혼잡 제어와 같은 기능을 처리하지 않기에 (4). TCP보다 속도가 빠르며 네트워크 부하가 적다는 장점이 있지만, 신뢰성 있

TCP vs UDP [내부링크]

TCP vs UDP 그림으로 비교하는 TCP vs UDP 각 프로토콜의 특징을 표로 비교해보면 다음과 같다. 프로토콜 종류 TCP UDP 연결 방식 연결형 서비스 비연결형 서비스 패킷 교환 방식 가상 회선 방식 데이터그램 방식 전송 순서 전송 순서 보장 전송 순서가 바뀔 수 있음 수신 여부 확인 수신 여부를 확인함 수신 여부를 확인하지 않음 통신 방식 1:1 통신 1:1 OR 1:N OR N:N 통신 신뢰성 높다. 낮다. 속도 느리다. 빠르다. 요약하면, TCP는 연속성보다 신뢰성 있는 전송이 중요할 때 사용되는 프로토콜이며, UDP는 TCP보다 빠르고 네트워크 부하가 적다는 장점이 있지만, 신뢰성 있는 데이터 전송을 보장하지는 않는다. 그렇기 때문에 신뢰성보다는 연속성이 중요한 실시간 스트리밍과 같은 서비스에 자주 사용된다.

Spring Batch [내부링크]

Spring Batch 란 Spring Batch는 복잡한 배치 처리 작업을 효율적으로 관리하고 구현하기 위한 프레임워크입니다. 배치(batch)라는 용어는 일괄 처리를 의미하며, 대규모 데이터 처리 작업을 자동화하여 일정한 시간이나 조건에 따라 실행되게 합니다. 예를 들어, 매월 1일에 이전 달의 데이터를 처리하여 월별 보고서를 생성하는 작업이 있을 수 있습니다. 이런 과정에는 데이터 추출, 계산 및 처리 등 여러 단계가 포함될 수 있습니다. 전통적으로는 Spring Schedule과 같은 스케줄링 도구를 사용하여 이러한 작업을 처리할 수 있으나, 이 방법은 서버 리소스를 과도하게 사용하거나 스케줄링 변경 시 서비스 재시작이 필요한 등의 단점이 있습니다. Spring Batch 장점 - 대용량 데이터 처리에 최적화되어 고성능 - 로깅, 통계처리, 트랜잭션 관리 등 재사용 가능한 필수 기능 지원 - 수동으로 처리하지 않도록 자동화되어 있음 - 예외 사항과 비정상적인 동작에 대한 방어

환율 정보 Open API를 활용한 Batch 만들기 [내부링크]

이론 편에서 실전 편으로 넘어가기 전에 배치에 대해서 알아보는 시간을 가지면 좋을 것 같아서, 한국수출입은행의 환율정보 Open API를 활용해서 간단한 배치 예제를 만들어 보았습니다. 한국수출입은행 Open API 발급 방법 Open API는 개발된 공공데이터를 누구나 사용할 수 있도록 공개된 API(Application Program Interface)를 말합니다. 한국수출입은행 페이지 정보가 없습니다. 요청하신 페이지를 찾을 수 없거나, 서버에서 삭제되었습니다. URL을 확인해주세요. 7325418305118562325 www.koreaexim.go.kr Open API 제공목록 한국수출입은행은 국제금리 API, 대출금리 API, 현재환율 API 를 제공하고 있습니다. 이 글에서는 현재환율 API를 사용하여 예제 코드를 작성해 보았습니다. Open API 개발명세 1. 요청 URL (Request URL) + 요청변수 요청 URL (Request URL) + authkey (인

EC2 + Route53 + 가비아로 HTTPS 적용하기 [내부링크]

HTTPS는 HTTP에 보안 기능을 추가한 프로토콜입니다. 기본적으로 HTTP는 웹 브라우저와 서버 간에 데이터를 주고받는 데 사용되는 프로토콜인데, 이 데이터 전송이 평문 형태로 이루어져 외부에서 데이터를 쉽게 엿볼 수 있는 단점이 있습니다. 반면, HTTPS는 SSL(Secure Socket Layer) 또는 TLS(Transport Layer Security)라는 암호화 프로토콜을 사용하여 데이터를 암호화합니다. 이로 인해 사용자와 서버 간의 모든 통신이 암호화되어 데이터의 기밀성과 무결성을 보장합니다. 또한, HTTPS는 SSL/TLS 인증서를 사용하여 웹 사이트의 신뢰성을 검증합니다. 이 인증서는 신뢰할 수 있는 제3자 기관에 의해 발급되며, 웹사이트의 신원을 확인하는 역할을 합니다. 사용자는 브라우저의 주소 표시줄에서 자물쇠 아이콘이나 HTTPS 접두사를 통해 사이트의 보안 상태를 쉽게 확인할 수 있습니다. HTTP에 비해 HTTPS는 보안성이 뛰어나지만, 암호화 과정에서

SpringBoot + Kafka 연동 [내부링크]

Kafka란 카프카(Kafka)는 웹사이트, 어플리케이션, 센서 등에서 수집된 데이터를 실시간으로 관리하고 전송하기 위해 설계된 분산 스트리밍 플랫폼입니다. 이 플랫폼은 데이터를 생성하는 어플리케이션과 데이터를 소비하는 어플리케이션 사이에서 중재자 역할을 하며, 데이터의 전송, 처리, 관리를 담당합니다. 카프카 시스템은 여러 요소(노드)로 구성될 수 있으며, 이를 '카프카 클러스터'라고 부릅니다. 이 시스템은 다른 메시징 시스템과 유사하게 어플리케이션과 서버 간의 비동기 데이터 교환을 용이하게 합니다. 또한, 카프카는 하루에 수조 개의 이벤트를 처리할 수 있는 능력을 가지고 있습니다. 간단히 말해, 카프카는 다양한 서비스로부터 나오는 데이터 흐름을 실시간으로 제어하고, 이를 통해 서비스 간 연결을 가능하게 하는 중추적인 역할을 하는 플랫폼입니다. 이를 통해 복잡한 데이터 환경에서도 효율적인 데이터 스트림 관리가 가능해집니다. Kafka의 기본 구성 요소 Cluster : 여러 대의

데이터 일괄 DELETE 쿼리 개선 [내부링크]

일전에 Kafka 연동을 통해 TEAM-SERVER의 UserSquad를 삭제하는 부분에서 JpaRepository의 deleteAllByUserId 메서드를 정의하여 사용하였다. @Transactional public void deleteUserSqaud(Long userId) { userSquadRepository.deleteAllByUserId(userId); } 그러나 코드 리뷰 과정에서 deleteAll 의 비효율성에 대해 이야기를 나눴다. 그럼 내부적으로 repository.delteAll 은 어떻게 작동하는 것일까? repository.deleteAll /* * (non-Javadoc) * @see org.springframework.data.repository.Repository#deleteAll() */ @Override @Transactional public void deleteAll() { for (T element : findAll()) { delete(elem

SpringBoot 3.x + FeignClient + Querydsl의 JOIN [내부링크]

FeignClient란 FeignClient는 스프링 클라우드 프레임워크에서 제공하는 기능 중 하나입니다. FeignClient는 원격 서비스에 대한 HTTP 요청을 보다 간편하게 작성할 수 있도록 도와줍니다. FeignClient를 사용하면 RESTful API를 호출할 때 인터페이스를 정의하고, 해당 인터페이스를 통해 HTTP 요청을 보낼 수 있습니다. 이를 통해 개발자는 직접 HTTP 요청을 작성하고 관리하는 번거로움을 줄일 수 있습니다. FeignClient는 주로 마이크로서비스 아키텍처에서 다른 서비스와의 통신에 사용됩니다. 서비스 간의 통신이 필요한 경우, FeignClient를 사용하여 해당 서비스의 API를 호출하고 응답을 받아올 수 있습니다. FeignClient를 사용하기 위해서는 먼저 스프링 프로젝트에 필요한 의존성을 추가해야 합니다. 그리고 FeignClient를 사용할 인터페이스를 정의하고, 해당 인터페이스에 원하는 HTTP 요청 메서드와 URL을 정의합니다.

Querydsl에서의 N + 1 문제 [내부링크]

TEAM-SERVER에서 Schedule의 정보들을 가져오는 Service 로직 메서드에서 N + 1 문제를 발견하였습니다. public List<ScheduleInfoDto> getScheduleInfo(Long userId) { List<Schedule> results = queryFactory .select(schedule) .from(userSquad) .join(squad) .on(userSquad.squadId.eq(squad.id)) .join(schedule) .on(squad.scheduleId.eq(schedule.id)) .where(userSquad.userId.eq(userId)) .fetch(); List<ScheduleInfoDto> scheduleInfoDto = new ArrayList<>(); for(Schedule result : results) { Team homeTeam = teamRepository.findById(result.getHomeTe

AWS Certified Cloud Practitioner (CLF-C01) 시험 샘플 문항 [내부링크]

1) 컴퓨팅 워크로드가 있는 애플리케이션의 경우 AWS가 기존 데이터 센터보다 경제적인 이유는 무엇입니까? A) Amazon EC2는 비용이 월별로 청구된다. B) 사용자는 Amazon EC2 인스턴스에 대한 전체 관리 액세스 권한을 보유한다. C) Amazon EC2 인스턴스는 필요시 온디맨드로 시작할 수 있다. D) 사용자는 최대 워크로드를 처리하는 데 충분한 인스턴스를 영구적으로 실행할 수 있다. C - 필요시 온디맨드로 인스턴스를 시작할 수 있으므로 다양한 워크로드에 응답하여 사용자가 인스턴스를 시작하고 종료할 수 있습니다. 이는 피크 로드를 처리하기에 충분한 온프레미스를 구입하는 것보다 경제적입니다. 2) 어떤 AWS 서비스가 AWS의 데이터베이스 마이그레이션을 간소화합니까? A) AWS Storage Gateway B) AWS Database Migration Service (AWS DMS) C) Amazon EC2 D) Amazon AppStream 2.0 B - 사용자

AWS Certified Cloud Practitioner Official Practice Question Set (CLF-C02-Korean) [내부링크]

1) Amazon S3에 저장된 민감한 데이터를 자동으로 검색, 분류 및 보호해야 하는 한 사용자가 있다. 이러한 요구 사항을 충족할 수 있는 AWS 서비스는 무엇인가? A. Amazon Inspector Amazon Inspector는 Amazon EC2 인스턴스에 배포된 애플리케이션의 보안 및 규정 준수를 개선하는 데 도움이 되는 자동화된 보안 평가 서비스입니다. Amazon Inspector는 S3 데이터 분류 및 자동 검색을 수행하지 않습니다. B. Amazon Macie Macie는 AWS에 배포된 애플리케이션의 보안 및 규정 준수를 개선하는 데 도움이 되는 자동 보안 평가 서비스입니다. C. Amazon GuardDuty GuardDuty는 악성 활동 및 무단 행위를 지속적으로 모니터링하여 AWS 계정 및 워크로드를 보호하는 위협 탐지 서비스로입니다. GuardDuty는 S3 데이터 분류를 수행하지 않습니다. D. Amazon Secrets Manager Secrets M

2024-03-04 ~ 2024-03-10 사이의 주요 뉴스 [내부링크]

스웨덴 스톡홀름의 경험 많은 개발자 Henrik Warne은 "소프트웨어 개발에서 배운 교훈들"을 공유했습니다. 이 교훈들에는 간단한 버전부터 시작해 점진적으로 확장하는 방법, 로깅과 에러 처리의 중요성, 변경은 한 번에 하나씩 하는 것, 그리고 프로그래밍이 예상보다 오래 걸릴 수 있다는 점 등이 포함됩니다. 또한, 버그가 항상 존재한다는 점을 받아들이고, 테스트와 문제 해결 시 우연을 배제하고 더 많은 조사와 테스트를 하는 것, 대면 커뮤니케이션의 중요성, 공로 인정 등 협력 방법에 대해서도 언급했습니다. 더불어 "러버덕 디버깅"에 대해서도 설명했습니다. 1BRC(1 Billion Row Challenge)는 Gunnar Morling이 제안한 도전으로, 10억 행의 텍스트 파일에서 온도 측정값을 빠르게 처리하는 것입니다. 여러 언어와 도구를 사용한 다양한 구현이 이어졌습니다. 특히 Ben Hoyt는 Go 언어를 사용해 단계별 최적화 과정을 통해 처리 시간을 1분 45초에서 4초로

Application Protocol(2) - DNS [내부링크]

DNS DNS는 한마디로 말해서 사람들이 쓰기 편한 호스트 네임(www.naver.com)을 컴퓨터가 알아들을 수 있는 아이피 주소(125.209.222.141)로 바꿔주는 서비스이다. 세상에 있는 모든 서버의 주소는 IP 주소를 가지고 있다. 따라서 사용자들이 해당 서버에 접속하기 위해서는 그 서버의 IP 주소를 외우고 입력해야 한다. 하지만, IP 주소는 보다시피 그냥 숫자와 점의 조합으로 이루어진 주소로, 사람들이 외우고 사용하기 매우 불편하다. 그래서 DNS 라는 서비스를 이용해 영문 주소와 IP 주소를 쉽게 매핑(mapping)하여 사용할 수 있는 것이다. 즉, 우리는 인터넷을 사용할 때 항상 DNS 서비스를 이용하는 셈이다. 유튜브를 보려고 www.youtube.com에 접속할때도 알게 모르게 DNS 서비스를 이용하게 된다. 참고로 Host name과 Domain name을 헷갈리기 쉬운데 Host name은 컴퓨터의 이름, Domain name은 컴퓨터 그룹의 이름이라고

2024-02-19 ~ 2024-02-25 사이의 주요 뉴스 [내부링크]

AI 기술의 급속한 확장이 우리의 작업 환경을 어떻게 변화시킬지에 대한 논의로 시작하는 이번 주 GeekNews Weekly는 다양한 분야에서의 혁신적 변화를 조명합니다. 생성형 AI의 등장으로 인해 반복적이고 단순한 작업들은 이제 소프트웨어가 담당하게 되며, 우리는 더 창의적이고 고수준의 업무에 집중할 수 있게 될 것입니다. 이러한 변화는 "GenAI 네이티브 프로슈머 제품"을 통해 더욱 명확해지며, 사용자 경험을 근본적으로 개선할 새로운 도구들이 등장하고 있습니다. 예를 들어, 몇 마디의 프롬프트만으로 초안을 작성해주는 편집기와 같은 도구들은 작업의 시작을 훨씬 용이하게 만들어줍니다. 또한, 멀티 모달 콘텐츠의 조합과 쉬운 변환 가능성은 콘텐츠 생성의 미래를 밝히고 있습니다. OpenAI의 Sora가 공개된 이후 Adobe 주가가 10% 하락한 것은 AI 도구들이 전문가용 도구 시장에 큰 영향을 미치고 있음을 보여줍니다. 외국어 학습 분야에서는 Duolingo와 같은 앱들이 많은

Transport Layer [내부링크]

Transport Layer OSI 3,4계층에 해당하며, 통신 노드 간의 연결제어 및 자료의 송수신을 담당한다. 데이터 단위는 세그먼트(실질적인 데이터 전송단위), 전송 주소는 Port 를 참조한다. 애플리케이션 계층의 세션과 데이터그램 통신 서비스를 제공한다. TCP, UDP가 핵심 프로토콜이다. TCP, UDP에 대한 구분을 하고 데이터에 대한 제어 정보가 포함된다. Segment(세그먼트)는 전송을 위해 데이터를 일정 크기로 나누며, 발신, 수신, 포트주소, 오류검출코드가 첨부된다. 어플리케이션들은 트랜스포트 계층의 프로토콜을 활용하기 위해 각 프로세스별로 소켓을 사용합니다. 컴퓨터에서 동시에 여러 어플리케이션이 실행되며, 각각이 하나 이상의 소켓을 생성할 수 있기 때문에, 트랜스포트 계층에서는 다수의 소켓으로부터 동시에 데이터가 전송되는 상황을 처리해야 합니다. 이러한 상황에서 필요한 기술이 바로 멀티플렉싱과 디멀티플렉싱입니다. 멀티플렉싱은 여러 어플리케이션으로부터 오는 데

System Structure & Program Execution 1 [내부링크]

컴퓨터 시스템 구조 device controller 각각의 장치들에는 작은 CPU가 탑재되어 있는데, 이를 디바이스 컨트롤러라고 합니다. 이 디바이스 컨트롤러들은 기계어로 연산을 수행하여 해당 장치의 작동을 관리합니다. 예를 들어, 하드 디스크를 관리하는 디바이스 컨트롤러를 디스크 컨트롤러라고 부릅니다. 이러한 컨트롤러들은 각각의 하드웨어 장치들과 효율적으로 소통하기 위해 설계되었으며, 장치의 성능을 최적화하고, 시스템과의 데이터 전송을 관리하는 중요한 역할을 담당합니다. local buffer 각각의 장치들에는 디바이스 컨트롤러와 마찬가지로 작은 메모리도 탑재되어 있습니다. 이 작은 메모리들은 해당 장치의 데이터 처리와 관련된 정보를 임시로 저장하는 역할을 합니다. 예를 들어, 디스크 컨트롤러에 내장된 메모리는 디스크의 입출력 작업에 필요한 데이터를 임시로 보관하면서, 데이터의 전송이나 처리를 보다 효율적으로 만들어 줍니다. 이러한 메모리는 장치의 성능을 향상시키고, 전체 시스템의

1과목: 데이터모델링의 이해 [내부링크]

PART1. 데이터모델의 이해 엔티티(Entity), 속성(Attribute), 인스턴스(Instance)에 대해서는 아래와 같이 생각하면 쉽습니다. 모델링의 개념 현실 세계의 비즈니스 프로세스와 데이터 요구 사항을 추상적이고 구조화된 형태로 표현하는 과정 데이터베이스의 구조와 관계를 정의하며, 이를 통해 데이터의 저장, 조작, 관리 방법을 명확하게 정의 모델링의 특징 1. 단순화(Simplification) - 현실을 단순화하여 핵심 요소에 집중하고 불필요한 세부 사항을 제거 - 단순화를 통해 복잡한 현실 세계를 이해하고 표현하기 쉬워짐 2. 추상화(Abstraction) - 현실세계를 일정한 형식에 맞추어 간략하게 대략적으로 표현하는 과정 - 다양한 현상을 일정한 양식인 표기법에 따라 표현 3. 명확화(Clarity) - 대상에 대한 애매모호함을 최대한 제거하고 정확하게 현상을 기술하는 과정 - 명확화를 통해 모델을 이해하는 이들의 의사소통을 원활히 함 데이터 모델링 유의점 1.

2024-02-26 ~ 2024-03-03 사이의 주요 뉴스 [내부링크]

Cresta의 인프라 엔지니어 Jack Lindamood가 자신의 경험을 바탕으로 작성한 이 글은 스타트업이 직면하는 다양한 기술적 결정들과 그에 따른 장단점을 상세히 설명하고 있습니다. 이 글은 특히 인프라 선택에 어려움을 겪는 이들에게 많은 도움이 될 것입니다. 또한, 소프트웨어 엔지니어들이 지속적으로 새로운 기술 트렌드를 따라가야 한다는 내용의 글도 있었는데, 이는 업무에 바쁜 상황에서도 최신 기술 동향을 놓치지 않기 위한 조언을 담고 있습니다. GeekNews Weekly는 다양한 기술 자료를 제공하여 엔지니어들의 학습에 도움을 주고자 합니다. 또한, GPT와 같은 AI 기술의 비즈니스 활용에 대한 글도 있었습니다. 많은 회사들이 GPT를 업무에 활용하면서 발생하는 비용 증가와 보안 문제를 어떻게 해결할지 고민하고 있으며, 이에 대한 다양한 해결 방안과 경험담이 공유되었습니다. 특히, 로컬 LLM과 하이브리드 접근 방식의 장단점에 대한 토론이 있었는데, 이는 AI 기술을 효율

Gateway-Server JwtToken (Pre)Filter 적용 및 USER-SERVER에서의 Header Token 활용 [내부링크]

MSA 환경에서 JwtTokenFilter를 적용하는 과정은 Gateway-Server에서 시작합니다. 이 과정에서는 Filter를 적용하여 모든 요청이 유효한 JWT 토큰을 가지고 있는지 검증합니다. 검증을 통과한 요청만이 내부 서비스로 전달되며, 이는 보안을 강화하고 서비스 간의 안전한 통신을 보장합니다. 또한, Gateway-Server는 로드 밸런싱도 담당하여, 요청을 여러 인스턴스에 균등하게 분배합니다. 이러한 과정을 통해 시스템의 안정성과 처리 능력을 높이며, MSA 환경에서의 서비스 운영을 최적화합니다. 요청이 들어오면, 매핑을 통해 프레디케이트에서 해당 요청이 처리될 조건을 판단합니다. 이후, 작업 실행 전에 사전 필터(Pre Filter)를 통과해야 하며, 이는 요청에 대한 초기 처리나 검증을 담당합니다. 조건에 부합하는 서비스가 실행되어, 요청에 대한 실제 로직이 처리됩니다. 작업이 종료된 후에는 후속 필터(Post Filter)를 통과하게 되는데, 이는 응답을 클

2024-02-12 ~ 2024-02-18 사이의 주요 뉴스 [내부링크]

회사에서 발생하는 일반적인 이슈 중 하나는 "개발팀에서 구현이 불가능하다"고 말할 때입니다. 경영진과 기획, 영업 부서에서는 다양한 아이디어를 제시하지만, 실제로 이를 구현해야 하는 개발팀에서는 여러 가지 이유로 인해 실행이 어렵다고 판단되는 경우가 많습니다. 이로 인해 개발팀과 다른 부서 간의 불화가 종종 발생합니다. 이 문제를 해결하기 위해 "개발자가 No라고 말할 때 물어봐야 할 4가지 질문"이라는 글에서는 효과적인 대화 방법을 제안합니다. 이 질문들은 다른 기술적 해결책의 가능성, 현재의 제약 조건 하에서의 대안 모색, 단계적 접근 방식의 가능성, 그리고 해결을 위한 기타 장애물의 존재 여부에 대해 다룹니다. 이러한 접근 방식은 개발자 자신이 자기 반성적으로 고민해 볼 수 있도록 돕고, 개발팀과 긴밀하게 협력해야 하는 이들에게 유용한 지침을 제공합니다. 최근 주목받는 기술 중 하나는 OpenAI가 발표한 Text-To-Video AI 모델 Sora입니다. 이 기술은 프롬프트를

Application Protocol(1) - HTTP/URI [내부링크]

OSI 5,6,7계층에 해당하며, 다른 계층의 서비스에 접근할 수 있는 응용 프로그램 서비스를 제공한다. 데이터 단위는 Data/Message 자체이다. 사용자가 소프트웨어 응용 프로그램을 사용하는 가장 가까운 계층이며, 이 인터페이스를 제공한다. 응용 프로그램 간의 데이터 통신을 위해 사용하는 프로토콜을 정의한다. (HTTP, FTP, SSH, Telnet 등) HTTP HTTP(Hypertext Transfer Protocol)는 인터넷상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜이다. 애플리케이션 레벨의 프로토콜로 TCP/IP위에서 작동한다. HTTP는 어떤 종류의 데이터든지 전송할 수 있도록 설계돼 있다. HTTP로 보낼 수 있는 데이터는 HTML문서, 이미지, 동영상, 오디오, 텍스트 문서 등 여러종류가 있다. 하이퍼텍스트 기반으로(Hypertext) 데이터를 전송하겠다(Transfer) = 링크기반으로 데이터에 접속하겠다는 의미이다. 작동방식 HT

Introduction to Operating Systems [내부링크]

운영체제(OS) 운영체제(OS, Operating System)는 컴퓨터 시스템의 핵심 소프트웨어로, 컴퓨터 하드웨어와 응용 프로그램 간의 상호작용을 관리하고 제어하는 역할을 한다. 운영체제의 목적은 사용자와 하드웨어 사이의 인터페이스를 제공해 효율적으로 응용 프로그램이 동작하도록 지원하고, 시스템 자원을 효율적으로 관리하여 응용 프로그램이 원활하게 동작할 수 있도록 한다. 운영체제의 코어(핵심) 부분을 커널(Kernel)이라고 하는데, 일반적으로는 커널에 여러가지 기능(라이브러리, 시스템 프로그램 등등)이 추가된 상태를 통칭해서 운영체제(OS)라고 한다. 컴퓨터 시스템 간략 구조도 운영체제의 역할 ① 자원 관리 운영체제는 컴퓨터 시스템의 하드웨어 자원을 효율적으로 관리하는 역할을 한다. CPU(중앙처리장치), 메모리(Memory), 저장장치(Storage), 입출력 장치(I/O Device) 등 하드웨어의 자원을 할당하고 관리하여 여러 응용 프로그램이 동시에 실행될 수 있도록 한다

Update 로직 수정(JPQL to JPA Dirty Checking) [내부링크]

회원 정보 수정 로직을 구현할 때 @Modifying 어노테이션을 활용하여 Update 쿼리를 직접 작성하여 수정하도록 Repository에서 코드를 구현했었습니다.(이렇게 개발한 이유는 Setter를 지양하기 위해 JPQL을 활용했던 부분이 가장 컸습니다.) 그러나 코드리뷰 과정에서 다음과 같은 이유로 JPA Dirty Checking 방식으로 코드를 구현하기로 하였습니다: JPA를 사용할 때 더티 체킹(Dirty Checking)을 활용하는 것은 매우 JPA스러운 접근 방식입니다. 더티 체킹은 엔터티의 상태가 변경될 때 이를 자동으로 감지하고 변경 사항을 데이터베이스에 반영하는 JPA의 핵심 기능 중 하나입니다. 이 과정은 트랜잭션이 커밋되는 시점에 실행되며, 변경된 엔터티의 스냅샷과 원본 엔터티를 비교하여 자동으로 UPDATE 쿼리를 생성하고 실행합니다. 더티 체킹을 이용하면, 개발자는 엔터티의 상태를 직접 관리하고 적절한 시점에 데이터베이스에 반영할 쿼리를 작성할 필요가 없습

Stateful, Stateless [내부링크]

쿠키와 세션을 사용하는 이유 서버와 클라이언트가 통신을 할 때 마다 서버는 클라이언트가 누구인지 인증을 계속해야 한다. 왜냐면 HTTP 프로토콜이 connectionless, stateless한 특성이 있기 때문이다. Connectionless Stateless 클라이언트가 요청을 한 후응답을 받으면 그 연결을 끊어 버리는 특징 통신이 끝나면 상태를 유지하지 않는 특징 이 특징들을 두고 HTTP는 무상태 프로토콜(stateless)이라 하기도 한다. Stateful, Stateless stateless (무상태) 는 서버에서 HTTP와 같은 client의 이전 상태를 기록하지 않는 접속. stateful (상태유지) 은 서버에서 client의 이전 상태를 기록. REST 개념에서 각각의 요청은 독립적인 stateless 방식이며, client가 상태정보를 모두 관리할 책임이 있다 stateless는 caching, load balancing, scale out이 장점이지만, 매 요청

Session/Cookies/Token [내부링크]

쿠키 쿠키는 클라이언트 측(브라우저)에서 관리되는 작은 기록 정보 파일이다. 쿠키에는 사용자 인증이 유효한 시간을 명시할 수 있으며, 한 번 유효 시간이 정해지면 브라우저를 끄더라도 인증이 유지된다는 특징이 있다. 쿠키 동작 방식 1. 클라이언트가 페이지를 요청 2. 서버에서 쿠키를 발급. (* 모든 사이트가 항상 최초의 요청에 세션 ID를 발급하는 것은 아님. 하지만 일반적으로 거의 모든 사이트가 사용자 추적을 위해서 최초 방문시 세션 ID를 발급하며, 세션 ID 명이나 값 등의 상세 정책은 사이트마다 다를 수 있다.) 3. HTTP 헤더에 쿠키를 포함 시켜 응답 4. 응답 헤더에는 Cookie 미포함, 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음. 그리고 5. 쿠키가 존재하면 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보내서 요청 6. 서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 경우, 쿠키를 업데이트 하여 변경된 쿠키를 HTTP

1과목: 소프트웨어 설계 [내부링크]

소프트웨어 공학의 개념 소프트웨어 재공학 소프트웨어 재공학(Software Reengineering)은 새로운 요구에 맞도록 기존 시스템을 이용하여 보다 나은 시스템을 구축하고, 새로운 기능을 추가하여 소프트웨어 성능을 향상시키는 것 분석 (Analysis) 기존 소프트웨어의 명세서를 확인하여 소프트웨어의 동작을 이해하고, 재공학할 대상을 선정하는 활동 재구성 (Restructuring) 기존 소프트웨어의 구조를 향상시키기 위하여 코드를 재구성하는 활동. 소프트웨어의 기능과 외적인 동작은 바뀌지 않음 역공학 (Reverse Engineering) 기존 소프트웨어를 분석하여 소프트웨어 개발 과정과 데이터 처리 과정을 설명하는 분석 및 설계 정보를 재발견하거나 다시 만들어 내는 활동. 일반적인 개발 단계와는 반대 방향으로 기존 코드를 복구하거나, 기존 소프트웨어의 구성 요소와 그 관계를 파악하여 설계도를 추출함. 이식 (Migration) 기존 소프트웨어를 다른 운영체제나 하드웨어 환경

TCP/IP 4계층 [내부링크]

TCP/IP 4계층 4층 - 애플리케이션 계층 — HTTP, FTP, DNS, SMTP 3층 - 전송 계층 — TCP, UDP 2층 - 인터넷 계층 — IP 1층 - 네트워크 엑세스 계층 — Ehternet(이더넷) 1. Network Layer (OSI 7계층에서 물리+데이터링크 계층) 이 계층은 Node-To-Node간의 신뢰성 있는 데이터 전송을 담당하는 계층이다. OSI7 계층의 물리 계층과 데이터링크 계층의 역할을 바로 이 계층이 담당하는 것으로 볼 수 있다. 2. Internet Layer (OSI 7계층에서 네트워크 계층) IP를 담당하는 계층 P를 사용하여 데이터의 원천지(origin)과 목적지(destination)에 관한 정보를 첨부한다. IP는 복잡한 네트워크 망을 통하여 가장 효율적은 방법으로 데이터의 작은 조각들을 되도록 빨리 보내는 일을 한다. 따라서 IP는 패킷 전달 여부를 보증하지 않고, 경로를 설정하여 어떻게든 빨리 보내도록 한다. Protocol Co

2과목: 소프트웨어 개발 [내부링크]

트리(Tree) 트리는 정점(Node, 노드)과 선분(Branch, 가지)을 이용하여 사이클을 이루지 않도록 구성한 그래프(Graph)의 특수한 형태임. 트리는 하나의 기억 공간을 노드(Node)라고 하며, 노드와 노드를 연결하는 선을 링크(Link)라고 함 트리는 가족의 계보(족보), 조직도 등을 표현하기에 적합 노드(Node): 트리의 기본 요소로서 자료 항목과 다른 항목에 대한 가지(Branch)를 합친 것 근 노드(Root Node): 트리의 맨 위에 있는 노드 디그리(Degree, 차수): 각 노드에서 뻗어 나온 가지의 수 단말 노드(Terminal Node): 자식이 하나도 없는 노드, 즉 디그리가 0인 노드 트리의 디그리: 노드들의 디그리 중에서 가장 많은 트리의 운행법 트리를 구성하는 각 노드들을 찾아가는 방법을 운행법(Traversal)이라 함 이진 트리를 운행하는 방법은 산술식의 표기법과 연관성을 갖는다 디진 트리의 운행법은 다음 세가지가 있음 Preorder 운행

3과목: 데이터베이스 구축 [내부링크]

SQL(Structured Query Language) sql은 국제 표준 데이터베이스 언어이며, 많은 회사에서 관계형 데이터베이스(RDB; Relational DataBase)를 지원하는 언어로 채택하고 있다. SQL은 질의(Query)어지만 데이터 정의(Data Define), 데이터 조작(Data Manipulation), 데이터 제어(Data Control) 기능을 모두 갖고 있다. SQL의 분류 DDL(Data Define, Language, 데이터 정의어) DDL은 SCHEMA, DOMAIN, TABLE, VIEW, INDEX를 정의하거나 변경 또는 삭제할 때 사용하는 언어이다. 논리적 데이터 구조와 물리적 데이터 구조의 사상을 정의한다. 데이터베이스 관리자나 데이터베이스 설계자가 사용 명령어 기능 CREATE SCHEMA, DOMAIN, TABLE, VIEW, INDEX를 정의 ALTER TABLE에 대한 정의를 변경 DROP SCHEMA, DOMAIN, TABLE, V

4과목 : 프로그래밍 언어 활용 [내부링크]

UNIX/LINUX 기본 명령어 cat 파일 내용을 화면에 표시함 chdir 현재 사용할 디렉터리의 위치를 변경함 chmod 파일의 보호 모드를 설정하여 파일의 사용 허가를 지정함 chown 소유자를 변경함 cp 파일을 복사함 exec 새로운 프로세스를 수행 find 파일을 찾음 fork 새로운 프로세스를 생성함(하위 프로세스 호출, 프로세스 복제 명령) fsck 파일 시스템을 검사하고 보수함 getpid 자신의 프로세스 아이디를 얻음 getppid 부모 프로세스 아이디를 얻음 ls 현재 디렉터리 내의 파일 목록을 확인함 mount/unmount 파일 시스템을 마운팅함/마운팅 해제함 rm 파일을 삭제함 wait fork 후 exec에 의해 실행되는 프로세스의 상위 프로세스가 하위 프로세스 종료 등의 event를 기다림 uname 시스템의 이름과 버전, 네트워크 호스트명 등의 시스템 정보를 표시 배치(Placement) 전략 최초 적합 (First-Fit) 프로그램이나 데이터가 들어갈

데이터베이스 키(KEY) [내부링크]

Key 종류 슈퍼 키(Super Key): 유일성을 만족하는 키. 예를 들면, {학번 + 이름}, {주민등록번호 + 학번} 복합 키(Composite Key): 2개 이상의 속성(attribute)를 사용한 키. 후보 키(Candidate key): 유일성과 최소성을 만족하는 키. 기본키가 될 수 있는 후보이기 때문에 후보키라고 불린다. 예를 들면, 주민등록번호, 학번 등 기본 키(Primary key): 후보 키에서 선택된 키. NULL값이 들어갈 수 없으며, 기본키로 선택된 속성(Attribute)은 동일한 값이 들어갈 수가 없다. 대체 키(Surrogate key): 후보 키 중에 기본 키로 선택되지 않은 키. 외래 키(Foreign Key): 어떤 테이블(Relation) 간의 기본 키(Primary key)를 참조하는 속성이다. 테이블(Relation)들 간의 관계를 나타내기 위해서 사용된다. 슈퍼키(Super Key) 7조라는 팀에 팀원은 4명이 있다. 이 4명을 구분할

IP Protocol [내부링크]

IP IP는 Internet Protocol의 약자로, 인터넷 망을 통해 패킷을 전달하는 프로토콜입니다.비연결성과 비신뢰성 이라는 특징이 있습니다. 비연결성은, 패킷을 보내는 길을 정하지 않는 것이고, 비신뢰성은 패킷의 완전한 전달을 보장하지 않는 것 입니다. 인터넷 프로토콜(IP)의 역할 지정한 IP 주소(IP Address)에 데이터 전달 패킷(Packet)이라는 통신 단위로 데이터 전달 이러한 전송하고자하는 정보 데이터의 형식을 패킷이라는 하나의 블록 단위로 이루어서 출발지IP에서 목적지 IP까지 패킷을 통해서 전달하고자하는 데이터를 전달합니다. 이러한 전송하고자하는 정보 데이터의 형식을 패킷이라는 하나의 블록 단위로 이루어서 출발지IP에서 목적지 IP까지 패킷을 통해서 전달하고자하는 데이터를 전달합니다. 버전 헤더길이 서비스타입 식별자 플래그 단편화 오프셋 Time-To-Live(TTL) 프로토콜 헤더 체크섬 송신자 IP주소 수신자 IP주소 이러한 구성으로 정해져있는 IP헤더

Routing Protocol [내부링크]

라우팅 프로토콜 라우팅(Routing) 라우팅이란 패킷을 전송하기 위해 송신측에서 목적지까지의 경로를 설정하고 정해진 경로에 따라 패킷을 전달하는 과정을 말한다. 라우팅 프로토콜의 종류 정적라우팅(Static routing): 관리자에 의해 Routing Table이 유지/관리 되는 기법 라우팅 테이블을 교환하지 않고 라우팅이 가능하기 때문에 네트워크 대역폭을 절약할 수 있다. 또한 외부에 자신의 경로를 알리지 않기 때문에 보안에도 강하다. 하지만 경로에 문제가 생길 경우 대처하기 어렵다는 단점이 있다. 동적라우팅(Dynamic routing): 라우팅 프로토콜에 의해 자동으로 라우팅 테이블을 구성하는 기법 자동으로 경로가 결정되는 프로토콜이다. 라우터가 판단하여 가장 효율적인 방법으로 패킷을 전송시키는 방법이다. 동적라우팅 내부라우팅(Inner Gateway Protocol)과 외부라우팅(External Gateway Protocol)로 나뉜다. 내부라우팅(IGP): 같은 AS 내

대칭키 vs 공개키(비대칭키) 암호화 [내부링크]

대칭키 대칭키는 위에서 설명한대로 암복호화키가 동일하며 해당 키를 아는 사람만이 문서를 복호화해 볼 수 있게된다. 대표적인 알고리즘으로는 DES, 3DES, AES, SEED, ARIA 등이 있다. 공개키 암호화 방식에 비해 속도가 빠르다는 장점이 있지만, 키를 교환해야한다는 문제 (키 배송 문제)가 발생한다. 키를 교환하는 중 키가 탈취될 수 있는 문제도 있고 사람이 증가할수록 전부 따로따로 키교환을 해야하기 때문에 관리해야 할 키가 방대하게 많아진다. 이러한 키 배송 문제를 해결하기 위한 방법으로 키의 사전 공유에 의한 해결, 키 배포센터에 의한 해결, Diffie-Hellman 키 교환에 의한 해결, 공개키 암호에 의한 해결이 있다. 대칭키 암호화 방식: 암복호화키가 동일한 암호화 방식 대표 알고리즘 : DES, 3DES, AES, SEED, ARIA 등 장점 : 수행 시간이 짧음 단점 : 안전한 키교환 방식이 요구됨, 사람이 증가할수록 키관리가 어려워짐 공개키(비대칭키) 위에

SpringBoot + Redis + Docker로 RefreshToken 구현 [내부링크]

Refresh Token 이란 Access Token의 유효기간을 짧게하여 보안도 높이고, 편의성도 챙기는 방법이다. 로그인을 완료하면, 유효기간이 짧은 Access Token과 유효기간이 긴 Refresh Token을 발급해준다. Access Token은 기존에 사용하던 JWT 토큰이라고 생각하면 되고, Refresh Token은 Access Token이 만료되었을 때, 새로 발급해주는 토큰이라고 생각하면 된다. Refresh Token의 필요성 Access Token 만료시간을 짧게 하면 보안성은 좋아집니다. 그러나, Access Token의 만료시간을 짧게 가져가면 사이트를 이용하는 회원은 자주 로그인 해야되는 불편함이 있습니다. 따라서, Refresh Token을 이용하여 Access Token을 재발급할 수 있고 Access Token의 유효 기간을 짧고 자주 재발급 하도록 만들어 보안을 강화하면서 사용자는 로그아웃 되어 다시 로그인해야 되는 상황을 주지 않도록 하기 위함입

Literal과 new String() [내부링크]

String literal & new String() 자바에서는 String 문자열 생성 방식은 두가지가 있다. 1, String literal 2. new String() 두개는 어떤 차이가 있을까? 둘의 차이는 저장되는 저장공간(메모리)의 차이이다. new 연산자를 사용하여 String을 생성하게 되면 객체로 생성이 되어 Heap메모리 영역에 저장이 되고, 리터럴(literal)을 사용하여 String을 생성할 경우 String constant pool이라는 영역에 생성이 된다. 리터럴을 사용하여 생성할 때 constant pool에 같은 값이 존재한다면 생성되는 객체는 이미 존재하고 있는 값을 참조하게 된다. 아래의 예제와 그림을 통해서 이해를 도와보자. String str1 = new String("Hello"); String str2 = "Hello"; String str3 = "Hello"; literal로 생성한 str2와 str3은 동일한 객체를 바라보지만, new S

네트워크 기초 [내부링크]

네트워크 Network 네트워크는 컴퓨터, 서버, 메인프레임, 네트워크 장치, 퍼리페럴, 또는 기타 장치 등 다양한 전자기기들이 서로 통신할 수 있도록 연결된 시스템입니다. 이러한 연결은 유선이나 무선 방식을 통해 이루어질 수 있으며, 데이터 교환, 자원 공유, 서비스 제공 등 다양한 목적으로 사용됩니다. 네트워크는 크기와 범위에 따라 개인적인 규모에서부터 전 세계를 아우르는 인터넷에 이르기까지 다양합니다. 네트워크를 통해 사용자들은 파일을 공유하고, 커뮤니케이션을 진행하며, 웹 페이지에 접속하고, 많은 다른 작업을 수행할 수 있습니다. 네트워크 구성 네트워크는 크게 3가지로 구성되어 있다. 1. 네트워크 엣지 (Network edge) 2. 엑세스 네트워크 (Access Network) 3. 네트워크 코어 (Network core) 네트워크 엣지 (Network edge) 네트워크의 가장 가장자리이다. 여기에는 수많은 end system들이 존재한다. 여기서 end system이란

AWS Elastic Load Balancer [내부링크]

로드밸런서(Load Balancer) 로드밸런서(Load Balancer)는 클라이언트와 서버 그룹 사이에서 중요한 역할을 수행하는 네트워크 기술입니다. 주요 기능은 서버에 가해지는 트래픽을 여러 서버로 분산시켜 각 서버의 부하를 경감하는 것입니다. 이는 특정 서버에 과도한 트래픽이 집중되어 서비스가 중단되는 상황을 방지하여 애플리케이션의 가용성과 내구성을 향상시킵니다. 서버의 부하 문제에 대응하는 두 가지 주요 전략은 스케일업(Scale Up)과 스케일아웃(Scale Out)입니다: 스케일업(Scale Up): 서버의 성능을 향상시키는 방법으로, 하드웨어의 물리적인 강화(예: CPU, RAM, 스토리지 업그레이드)를 통해 처리 능력을 증가시킵니다. 이 방법은 단일 서버의 성능을 높이지만, 비용 증가, 업그레이드에 따른 다운타임, 하드웨어의 물리적 한계 등의 단점이 있습니다. 스케일아웃(Scale Out): 서버의 수를 늘리는 방법으로, 추가 서버를 도입하여 트래픽을 분산시키고 전체

Autoscaling [내부링크]

오토 스케일링 (Auto Scaling) 클라우드 컴퓨팅의 가장 큰 장점 중 하나는 필요에 따라 서비스의 규모를 빠르게 확장하거나 축소할 수 있는 뛰어난 유연성에 있습니다. 특히, 오토스케일링은 이러한 유연성을 극대화하는 핵심 기술로 자리매김하고 있습니다. 오토스케일링은 CPU, 메모리, 디스크, 네트워크 트래픽 등의 다양한 시스템 자원의 사용량을 모니터링하여, 이를 기반으로 서버의 규모를 자동으로 조정하는 서비스를 제공합니다. 이 기술을 활용함으로써 사용자들은 예기치 않은 서비스 부하에 신속하게 대응할 수 있으며, 비용을 최소화하면서도 안정적이고 예측 가능한 서비스 성능을 유지할 수 있습니다. 스케일링 스케일링 이란 인스턴스 혹은 컴퓨팅 파워를 늘리는 것을 말합니다다. 스케일링의 방법에는 대표적으로 2가지가 있습니다. 스케일업(Scale Up) 스케일 업(Scale Up)은 기존 인스턴스의 리소스(예: CPU, 메모리)를 물리적으로 확장하여 성능을 향상시키는 방법을 의미합니다. 예

AWS VPC [내부링크]

VPC Amazon Virtual Private Cloud (VPC)는 AWS 클라우드 내에서 사용자가 정의한 가상 네트워크입니다. 이를 통해 사용자는 AWS 클라우드의 리소스를 다른 고객과 완전히 논리적으로 격리된 환경 내에서 배포할 수 있습니다. VPC를 사용함으로써, 사용자는 자신의 IP 주소 범위, 서브넷, 라우팅 테이블, 네트워크 게이트웨이 등 네트워크 구성 요소를 세밀하게 제어할 수 있으며, 가상 네트워킹 환경 내에서 AWS 리소스를 안전하게 시작하고 관리할 수 있습니다. VPC는 사용자에게 클라우드 내에서 자체적인 프라이빗 네트워크 공간을 생성하고 구성할 수 있는 능력을 부여함으로써, 온프레미스 데이터 센터가 제공하는 보안 및 네트워크 구성 옵션과 유사한 수준의 네트워크 격리 및 보호 기능을 제공합니다. 이러한 격리는 VPC 내에서 실행되는 리소스가 인터넷과의 통신을 제어하고, VPC 간 또는 VPC와 온프레미스 네트워크 간의 안전한 연결을 설정할 수 있도록 하여, 엔터

AWS 리소스 마이그레이션 [내부링크]

"기존 운영하던 INSTANCE도 새 VPC로 옮겨와야 되는데, AWS에서는 INSTANCE를 다른 VPC로 옮겨 올 수 있나요?" 운영중인 Instance나 DB는 VPC를 옮길 수는 없습니다. 그런데 Instance는 AMI로 DB는 snapshot이라는 것을 찍은 다음에 그걸로 다시 만들면 됩니다. 그렇게 WEB+APP와 DB 서버를 Snapshot을 찍은 뒤에 새로운 VPC에 다시 만들면 될 것 같습니다. "WEB 서버와 APP 서버도 나누어야 합니다." "지금 아키텍처에 문제가 없을까요?" 관리를 하기 위해 WEB 서버에 SSH 보트를 열어 놓고 저기에 접속한 다음 APP, DB 서버를 접근하는 방식으로 관리를 하는데, 문제가 있습니다. WEB 서버에 누군가 침입하면 APP, DB 서버들 다 문제가 생길 수 있습니다. 어차피 ELB가 있는데 외부에서 직접 WEB 서버에는 접근할 필요가 없습니다. WEB 서버도 Private Subnet에 옮기고 ELB만 사용자들이 접근할 수

생성자(Constructor) [내부링크]

생성자(Constructor) 생성자의 목적 생성자(Constructor)는 객체가 생성될때 자동으로 호출되는 특수 목적의 멤버함수(메소드)로 객체의 초기화를 위해 사용됩니다. 생성자의 특징 생성자의 이름은 클래스 이름과 동일해야 합니다. 생성자는 다른 멤버함수(메소드)와는 다르게 리턴 타입이 없습니다. 생성자는 객체가 생성될때 자동으로 한번 호출됩니다. 생성자는 매개변수 조건에 따라 여러개를 작성할 수 있습니다. (오버로딩) 생성자는 클래스에 최소 1개는 있어야 하며, 생성자 코드가 없을 경우 컴파일러가 기본생성자를 자동으로 생성합니다. (주의할점은, 생성자 코드가 1개라도 작성되어 있다면, 컴파일러는 기본생성자가 없다고 하더라도 기본생성자를 자동으로 생성하지 않습니다.) 생성자 사용법 (예제1) 클래스에 기본생성자와 매개변수를 가진 생성자를 정의했을 경우 1) Book 클래스 정의 public class Book { String title; int price; public Boo

Compiler/Interpreter [내부링크]

Compiler 컴파일러는 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램을 말한다. 컴파일러는 high-level 프로그래밍 언어(ex: C언어)를 low-level 언어(ex: 어셈블리어)로 바꾸어 실행 프로그램을 만들기 위해 사용된다. 원래의 문서를 소스코드 혹은 원시 코드라고 부르고, 출력된 문서를 목적 코드라고 부른다. 원시 코드에서 목적 코드로 옮기는 과정을 컴파일이라고 한다. Interpreter 인터프리터는 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경을 말한다. 인터프리터는 high-level 프로그래밍 언어로 작성된 원시 코드 명령어들을 한 번에 한 줄씩 읽어 들여서 실행하는 프로그램이다. 컴파일러는 high-level 언어를 직접 low-level 언어로 번역하지만, 인터프리터는 중간 형태로 번역하여 그것을 실행한다. 인터프리터는 한번에 한 줄씩 명령어를 읽어 들여서 실행하기 때문에 컴파일된 프로

Hash(해시) [내부링크]

해시 테이블(Hash Table) 해시 테이블이란, (key, value)의 형태로 데이터를 저장하는 자료구조 해시 함수에 key를 적용해 나온 결과를 배열의 인덱스로 하고, 그 자리에 value를 저장한다. 해시 충돌이 일어나지 않는 경우, 해시테이블의 시간 복잡도는 O(1) 해시 함수 key를 해쉬로 바꿔주는 역할을 한다. 다양한 길이를 가지고 있는 key를 일정한 길이의 hash로 바꾸어 공간을 효율적으로 관리 (key의 길이 > hash의 길이) 해시 충돌(Hash Collision)을 최소화 하는 해시 함수를 만드는 것이 중요 해시 충돌 서로 다른 키가 같은 값을 가지는 경우 ex) “Sam Smith”와 “Emilty Kim”을 해시 함수에 넣었을 때 같은 결과가 나오는 경우 해시 충돌의 해결법 1. Chaining(체이닝) 해시 충돌이 일어났을 때, 이를 동일한 버킷에 저장하는데, 이를 연결리스트 형태로 저장하는 방법 시간 복잡도 탐색/삭제는 키에 해당하는 리스트의 길이

추상클래스 VS 인퍼테이스 [내부링크]

추상클래스(Abstract Class) 추상 클래스(Abstract Class)는 추상 메서드를 선언해 놓고 상속을 통해 자식 클래스에서 메서드를 완성하도록 유도하는 클래스이다. 이러한 특성 탓에 미완성 설계도라고 표현하기도 한다. 추상클래스는 상속을 위한 클래스이기 때문에 따로 인스턴스를 생성할 수 없다. abstract class 클래스{ ... public abstract void 메서드(); } class 앞에 "abstract" 예약어를 붙여 해당 클래스가 추상 클래스임을 나타낸다. 또한 메서드도 abstract 예약어를 붙여 추상 메서드를 선언할 수 있다. 추상 클래스는 추상 메서드를 가지지 않아도 괜찮다. 다만, 추상 메서드를 하나라도 가진다면 그 클래스는 추상 클래스가 된다. 추상 메서드를 선언했다면 자식 클래스는 해당 메서드를 반드시 구현하도록 강제된다. JAVA는 다중 상속을 지원하지 않기 때문에 여러 개의 추상 클래스를 상속할 수 없다. 추상 클래스는 static

AOP 적용 @ControllerAdvice/@RestControllerAdvice [내부링크]

스프링 AOP (Aspect Oriented Programming) AOP, 즉 관점 지향 프로그래밍은 코드의 모듈화를 통해 소프트웨어 개발의 유연성과 재사용성을 높이기 위해 고안된 프로그래밍 패러다임입니다. 이 방식은 특히 반복되는 코드와 핵심 비즈니스 로직을 분리하여, 개발자가 핵심 기능에 더 집중할 수 있게 해줍니다. AOP는 핵심적인 관점과 부가적인 관점을 명확히 구분하고, 이러한 관점들을 독립된 모듈로 개발함으로써 코드의 재사용성을 극대화하고 유지보수를 용이하게 합니다. 부가적인 관점은 주로 시스템의 전반적인 서비스 품질을 관리하는데 사용되며, 예를 들면, 보안, 트랜잭션 관리, 로깅 등과 같은 기능을 처리합니다. AOP를 사용하면, 흩어진 관심사인 Crosscutting Concerns를 효과적으로 관리할 수 있습니다. 이는 코드의 중복을 줄이고, 각 기능을 분리하여 관리함으로써 소프트웨어의 모듈성을 향상시키는데 중요한 역할을 합니다. 예를 들어, 로깅 기능을 AOP를 통

SOLID [내부링크]

객체지향 프로그래밍 설계시 좋은 객체지향 설계를 위한 SOLID 라고 불리는 5가지 원칙이 있습니다. SOLID 원칙은 소프트웨어를 설계함에 있어 이해하기 쉽고, 유연하며, 유지보수 및 확장이 편하다는 장점이 있습니다. 1. SRP(Single responsibility principle) : 단일 책임 원칙 2. OCP(Open-closed principle) : 개방-폐쇄 원칙 3. LSP(Liskov substitution principle) : 리스코프 치환 원칙 4. ISP(Interface segregation principle) : 인터페이스 분리 원칙 5.DIP(Dependency inversion principle) : 의존관계 역전 원칙 SRP - 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. 모든 클래스는 각각 하나의 책임만 가져야 하며, 수정할 이유는 단 한 가지여야 합니다. 즉, 클래스는 그 책임을 완전히 캡슐화해야 함을 말합니다. 예를들어, 결제

프로그래머스 &lt;가장 많이 받은 선물&gt; JAVA [내부링크]

* 프로그래머스 가장 많이 받은 선물 코딩테스트 연습 - 가장 많이 받은 선물 선물을 직접 전하기 힘들 때 카카오톡 선물하기 기능을 이용해 축하 선물을 보낼 수 있습니다. 당신의 친구들이 이번 달까지 선물을 주고받은 기록을 바탕으로 다음 달에 누가 선물을 많이 받을지 예측하려고 합니다. 두 사람이 선물을 주고받은 기록이 있다면, 이번 달까지 두 사람 사이에 더 많은 선물을 준 사람이 다음 달에 선물을 하나 받습니다. 예를 들어 A 가 B 에게 선물을 5번 줬고, B 가 A 에게 선물을 3번 줬다면 다음 달엔 A 가 B 에게 선물을 하나 받습니다. 두 사람이 선물을 주고받은 기록이 하나도 없거나 주고받은 수가 ... school.programmers.co.kr * 문제 풀이 import java.util.*; class Solution { public int solution(String[] friends, String[] gifts) { int n = friends.length; in

프로그래머스 &lt;개인정보 수집 유효기간&gt; JAVA [내부링크]

* 프로그래머스 개인정보 수집 유효기간 코딩테스트 연습 - 개인정보 수집 유효기간 고객의 약관 동의를 얻어서 수집된 1~ n 번으로 분류되는 개인정보 n 개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다. 예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야... school.programmers.co.kr * 문제풀이 import java.time.format.*; import java.time.*; import java.util.*; class Solution { public int[] solution(String today

그래프(Graph) [내부링크]

그래프(Graph)의 개념 단순히 노드(Node)와 그 노드를 연결하는 간선(Edge)를 하나로 모아 놓은 자료구조 그래프(Graph) 용어 정점(vertex): 위치라는 개념 (Node) 간선(edge): 위치 간의 관계. 즉, 노드를 연결하는 선 인접 정점(adjacent vertex): 간선에 의해 직접 연결된 정점 정점의 차수(degree): 무방향 그래프에서 하나의 정점에 인접한 정점의 수 진입 차수(in-degree): 방향 그래프에서 외부에서 오는 간선의 수 진출 차수(out-degree): 방향 그래프에서 외부로 향하는 간선의 수 경로의 길이(path length): 경로를 구성하는데 사용된 간선의 수 단순 경로(simple path): 경로 중에서 반복되는 정점이 없는 경우 사이클(cycle): 단순 경로의 시작 정점과 종료 정점이 동일한 경우 그래프(Graph)의 종류 무방향 그래프 VS 방향 그래프 무방향 그래프(Undirected Graph): 무방향 그래프의

트리(Tree) [내부링크]

트리(Tree) 트리는 그래프의 한 일종이다. 트리는 스택이나 큐와 같은 선형 구조가 아닌 비선형 자료구조이다. 트리는 계층적 관계 (Hierarchical Relationship)을 표현하는 자료구조이다. 트리(Tree)의 특징 연결 그래프이다. (컴포넌트가 하나이다) 방향을 무시하였을 때, 싸이클이 존재하지 않는다. 트리의 간선 개수는 반드시 트리의 정점 개수보다 1 작다. 루트를 제외하면 모든 노드가 자신의 부모 노드와 이어진 간선을 1개 갖기 때문 한 개의 루트 노드만이 존재하며 모든 자식 노드는 한 개의 부모 노드만을 가진다. 순회는 Pre-order, In-order 아니면 Post-order로 이루어진다. 루트 노드: 가장 위에 있는 노드를 뜻합니다. 내부 노드: 루트 노드와 리프 노드 사이에 있는 노드를 뜻합니다. 리프 노드: 자식 노드가 없는 노드를 뜻합니다. 트리의 높이와 레벨 깊이(레벨): 루트 노드부터 특정 노드까지 최단 거리로 갔을 때의 거리를 말합니다. 예를

IoC (Inversion of Control) [내부링크]

IoC (Inversion of Control) IoC(제어 반전)이란, 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미합니다. 컴포넌트 의존관계 설정(Component dependency resoulution), 설정(Configuration) 및 생명주기(LifeCycle)을해결하기 위한 디자인 패턴(Design Pattern)입니다. IoC 컨테이너 컨테이너? - 컨테이너는 보통 객체의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것 스프링 프레임워크도 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너가 있는데, 그것이 바로 IoC 컨테이너(=스프링 컨테이너) 입니다. 인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해줍니다. 객체관리 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에 집중할 수 있는 장점이 있습니다. IoC 컨테이너는 객체의 생성을 책

DI(의존성 주입) [내부링크]

DI(의존성 주입) Spring은 @Autowired 어노테이션을 이용한 다양한 의존성 주입(DI; Dependency Injection) 방법을 제공합니다. 의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아 사용하는 것입니다. 이를 통해 객체간의 결합도를 줄이고 코드의 재활용성을 높일 수 있습니다. @Autowired 는 Spring에게 의존성을 주입하는 지시자 역할로 쓰입니다. 의존성 주입을 해야 하는 이유 Test가 용이해진다. 코드의 재사용성을 높여준다. 객체 간의 의존성(종속성)을 줄이거나 없앨 수 있다. 객체 간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다. 의존성 주입의 3가지 방법 1. 생성자 주입(Constructor Injection) 2. 필드 주입(Field Injection) 3. 수정자 주입(Setter Injection) 의존성 주입은 위의 3가지 방법이 있습니다. 생성자 주입(Constructor Injection) @Co

AVL 트리 [내부링크]

AVL 트리 이진탐색트리는 큰 문제점이 있으니, 위 그림과 같이 한쪽으로 노드가 쏠릴 수가 있다. 10,9,8,7,6을 순서대로 삽입한다고 생각해보면 저런 형태의 트리가 만들어진다는 것을 알 수 있을 것이다. 위와 같은 형태의 트리에서 특정 값을 찾으려면 O(n)의 시간이 필요할 것이다. 예를 들어 6을 찾으려면 모든 노드를 탐색해야지 찾을 수 있다. 따라서 성능이 매우 나빠지게 된다. 이런 단점을 극복할 수 있는 자료구조가 AVL트리이다. 예를 들어 [그림 1]의 편향트리를 [그림 2]처럼 AVL 트리로 재구성하면 어떤 노드를 탐색하든 O(log N)에 탐색할 수 있다. AVL트리는 다음과 같은 특징을 가진다. 1. 이진 탐색 트리의 속성을 가진다. 2. 왼쪽, 오른쪽 서브 트리의 높이 차이가 최대 1이다. 3. 높이 차이가 1보다 커지면 회전(Rotation)을 통해 균형을 맞춰 높이 차이를 줄인다. 4. 삽입, 검색, 삭제의 시간 복잡도가 O(logn)이다. (N : 노드의 개

JVM(Java Virtual Machine) [내부링크]

JVM(Java Virtual Machine) JVM은 Java Virtual Machine, 즉 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다. JVM은 OS와 Java 애플리케이션 사이의 중개자 역할을 한다. JVM은 자바 바이트코드를 실행할 수 있는 환경을 제공해준다. 이를 통해 자바 바이트 코드가 플랫폼에 독립적으로 어디서든 실행될 수 있게 한다. 즉, JVM 덕분에 OS에 상관없이 어디서든 JAVA 애플리케이션을 실행할 수 있게 된다. JVM 구성 Class Loader(클래스 로더) JVM내로 클래스파일(.class)를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다. Runtime 시점에 클래스를 로딩하게 해주며 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드하게 된다. Execution Engine(실행 엔진) 로드된 클래스의 바이트코드를 실행하는 런타임 모듈이 바로 실행 엔진이다. 클래스 로더를 통해 JVM 내의 Runtime Data A

Red Black Tree (레드 블랙 트리) [내부링크]

Red Black Tree (레드 블랙 트리) 레드 블랙 트리는 균형 이진 탐색 트리로 탐색, 삽입, 삭제 모두 시간 복잡도가 O(logn) 입니다. 각 노드는 빨간색 또는 검은색의 색상을 나타내는 추가 비트를 저장하며, 삽입 및 삭제 중에 트리가 균형을 유지하도록 하는데 사용됩니다. * 균형이진트리 단, 다음의 성질을 만족하도록 색칠을 해야 하는데, 이를 레드블랙특성이라 한다. 노드는 레드 혹은 블랙의 색을 가진다. 루트는 블랙이다. 모든 리프(NIL)노드는 블랙이다. 노드가 레드이면 그 노드의 자식은 반드시 블랙이다. (블랙의 자식은 뭐든 상관없다.) 로트 노드에서 임의의 리프 노드에 이르는 경로에서 만나는 블랙 노드의 수는 모두 같다. 5번째 특성때문에 밸런스가 맞아지고 O(logn)의 시간복잡도를 가지게 된다. “모든 리프 노드와 루트 노드는 블랙이고 어떤 노드가 레드이면 그 노드의 자식은 반드시 블랙이다.” NIL이 뭐냐면 null값같은 노드이다. 원래 아무것도 없는건데 레

Java 메모리 영역 [내부링크]

JVM JVM 이란 Java Virtual Machine의 약자이며, 자바 가상 머신이라고 불린다. Java의 바이트 코드를 해석하고 실행하는 역할을 한다. OS에 상관없이 실행할 수 있는것이 장점이다. (JVM 설치만 하면 어떤 운영체제에서든 java 파일을 실행할 수 있다.) JVM 실행 순서 .java 파일을 컴파일러(Compiler)를 통해 .class 파일로 변환한다. .class 파일을 JVM 의 ClassLoader(클래스로더)에게 보낸다. 클래스로더에서 JVM 런타임 영역으로 로딩(할당)하여 메모리에 올린다. JVM의 RunTime Data Area(런타임 데이터 영역) Java 메모리 영역을 알기 위해선 런타임 데이터 영역에 대해서 알아야한다. 클래스 로더가 .class 파일을 이 영역에 올리기 때문이다. 런타임 데이터 영역에는 5가지 영역이 존재한다. 1. Static Area(Method Area) 2. Heap Area 3. Stack Area 4. PC Reg

Heap(힙) [내부링크]

Heap(힙) 완전 이진 트리의 일종으로 우선순위 큐를 위하여 만들어진 자료구조이다. 여러 개의 값들 중에서 최댓값이나 최솟값을 빠르게 찾아내도록 만들어진 자료구조이다. 힙은 일종의 반정렬 상태(느슨한 정렬 상태) 큰 값이 상위 레벨에 있고 작은 값이 하위 레벨에 있다는 정도 간단히 말하면, 부모 노드의 키 값이 자식 노드의 키 값보다 항상 큰/작은 이진 트리를 말한다. 힙 트리에서는 중복된 값을 허용한다. (이진 탐색 트리에서는 중복된 값을 허용하지 않는다.) ** 완전이진트리 최대 힙 (max Heap) 부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진 트리 key(부모 노드) ≥ key(자식 노드) 최소 힙 (min Heap) 부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진 트리 key(부모 노드) ≤ key(자식 노드) 힙(heap)의 구현 힙을 저장하는 표준적인 자료구조는 배열이다. 구현을 쉽게 하기 위하여 배열의 첫 번째 인덱스인 0은

Priority Queue (우선 순위 큐) [내부링크]

Priority Queue (우선 순위 큐) 우선순위 큐는 우선순위 대기열이라고도 하며, 대기열에서 우선순위가 높은 요소가 우선순위가 낮은 요소보다 먼저 제공되는 자료 구조입니다. 우선순위를 가진 데이터들을 저장하는 큐(Queue)를 의미 데이터를 꺼낼 때 우선순위가 높은 데이터가 가장 먼저 나온다는 특징이 있어 많이 활용되고 있다. 운영체제의 작업 스케줄링, 정렬, 네트워크 관리 등의 다양한 기술에 적용되고 있다. Priority Queue (우선순위 큐)와 Queue (큐)의 차이점 일반적인 큐: 선형적인 형태를 가지고 있다. 우선순위 큐: 트리(Tree) 구조로 보는 것이 합리적이다. 우선순위 큐는 완전 이진트리 형태의 힙을 이용해 구현할 수 있다. 우선순위 큐의 삽입과 삭제는 c(cccc)의 시간 복잡도를 가집니다. 따라서 우선순위 큐를 이용한 정렬은 c(ccccc)의 시간 복잡도를 가진다.

DB Clustering & Replication [내부링크]

DB Clustering DB 클러스터링은 여러 데이터베이스 서버가 DB 처리를 분담하는 방식입니다. 이를 통해 하나의 서버에 문제가 발생해도 시스템이 계속 작동할 수 있으며, 여러 서버에 부하를 분산시켜 사용자 요청을 더 많이 처리할 수 있습니다. 이는 로드 밸런싱이라고 불리며, 시스템의 가용성을 높입니다. 가용성이란 시스템이 작동하는 시간 대비 정지한 시간의 비율을 의미합니다. DB 시스템은 서버나 스토리지 장비를 2대 이상 구성하여, 한쪽에 장애가 발생하더라도 신속하게 운용을 재개할 수 있도록 설계됩니다. DB Clustering 종류 및 장점 1. Active - Active Clustering Active-Active 클러스터링은 두 개 이상의 데이터베이스 서버가 모두 활성 상태로 동작하는 구성 방식입니다. 장점: 서버 중 하나가 실패하더라도 다른 서버가 즉시 역할을 수행하여 서비스 중단 시간이 발생하지 않습니다. 이를 통해 무중단 서비스를 제공할 수 있습니다. 여러 서버가

프로그래머스 &lt;타겟 넘버&gt; JAVA [내부링크]

* 프로그래머스 타겟 넘버 코딩테스트 연습 - 타겟 넘버 n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3 사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solut... school.programmers.co.kr 이 문제는 주어진 숫자 배열에서 숫자들을 순서를 바꾸지 않고 더하거나 빼서 특정 타겟 넘버를 만드는 방법의 수를 찾는 것입니다. 제한사항: 숫자 배열(numbers)의 개수는 2개 이상 20개 이하입니다. 배열에 포함된 각 숫자는 1 이상 50 이하

인프런 &lt;스프링 쿨러&gt; JAVA [내부링크]

* 인프런 스프링 쿨러 수직선상으로 표현되는 잔디밭에 스프링 쿨러가 설치되어 있습니다. 잔디밭의 길이는 0번부터 N번 위치까지 이며, 각 위치에 스프링클러가 N+1개 설치되어 있습 니다. 또한 각 스프링쿨러는 물을 뿌리는 범위값이 있는데 만약 3번 위치에 있는 스프링 쿨러 의 범위값이 2이면 이 스프링클러는 수직선상 (3-2, 3+2) 인 (1, 5)범위에 물을 뿌릴수 있습 니다. 매개변수 n에 N이 주어지고, 매개변수 nums에 0번 위치부터 N번 위치까지 N+1개의 스 풀링 쿨러의 물을 뿌리는 범위값이 차례로 주어지면 현수가 최소 몇 개의 스프링 쿨러를 작동 시키면 모든 잔디밭에 물을 줄 수 있는지 최소 스프링 쿨러의 개수를 반환하는 프로그램을 작 성하세요. 모든 잔디밭에 물을 줄 수 없으면 -1를 반환합니다. 입출력 예 제한사항: • 3 <= n <= 200,000 • nums의 원소값은 100을 넘지 않는 양의 정수입니다. 예제 1번 설명 : 1번, 3번, 6번 위치의 스프링

영속성 컨텍스트(Persistence Context) [내부링크]

영속성 컨텍스트(Persistence Context) ORM(Object-Relational Mapping)은 객체와 데이터베이스 테이블 간의 매핑을 통해 객체지향 프로그래밍 언어에서 사용되는 객체를 데이터베이스 테이블에 저장하는 기술입니다. JPA(Java Persistence API)는 Java에서 사용되는 ORM 기술의 표준으로, 엔티티 클래스와 데이터베이스 테이블 간의 매핑을 제공합니다. JPA에서 중요한 개념 중 하나는 '영속성 컨텍스트(Persistence Context)'입니다. 영속성 컨텍스트는 엔티티 객체들의 생명주기를 관리하며, 엔티티 객체들을 애플리케이션 내에서 지속적으로 보관하고 관리하는 역할을 합니다. 이것은 논리적인 개념으로, 실제로 보이지는 않지만 엔티티 매니저(Entity Manager)를 통해 접근하고 관리할 수 있습니다. 엔티티의 생명주기 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속(managed) : 영

배열(Array) [내부링크]

배열은 동일한 데이터 타입을 가진 변수들의 유한 집합으로 정의됩니다. 배열을 구성하는 각각의 값들을 '배열 요소(element)'라고 하며, 이 요소들은 '인덱스(index)'라는 숫자를 통해 배열 내의 위치를 나타냅니다. 배열의 인덱스는 0부터 시작합니다. 첫 번째 요소의 인덱스가 0인 이유는 배열의 인덱스가 첫 번째 요소로부터 상대적인 위치를 나타내기 때문입니다. 예를 들어, 첫 번째 요소는 시작점에서 0만큼 떨어져 있으므로 인덱스 0을 갖습니다. 배열의 이름은 배열의 식별자로 사용되며, 동시에 배열의 첫 번째 요소의 메모리 주소를 나타냅니다. 즉, 배열의 이름 자체가 메모리 주소 상수로 기능합니다. 예를 들어, anData 배열의 첫 번째 요소의 실제 메모리 주소가 0x0012FF60이라면, anData는 이 주소를 나타냅니다. 만약 배열이 int형 요소들로 구성되어 있고 각 int의 크기가 4바이트라면, 두 번째 요소의 메모리 주소는 첫 번째 요소 주소에 4바이트를 더한 0x

스프링 프레임워크(Spring Framework) [내부링크]

Spring Framework란? Spring framework란 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크이며 엔터프라이즈급 애플리케이션을 개발하기 위한 기능을 종합적으로 제공하는 솔루션입니다. 간단히 Spring이라고도 합니다. 엔터프라이즈급(Enterpris) 애플리케이션 이란? 대규모 조직에서 강력하고 확장 가능하도록 설계된 응용 프로그램을 나타내는 말입니다. 즉, 대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로 부터 행해지는 매우 큰 규모의 환경을 엔터프라이즈급 환경이라 합니다. Spring Framwork의 특징 1. 생명주기 관리 스프링 프레임워크는 경량컨테이너로 Java 객체를 직접 담고 관리한다. 객체의 생성, 소멸을 직접 관리하여 언제든 Spring 컨테이너로 부터 필요한 객체만 사용할 수 있다. 2. 제어 역전(Inversion of Control, IoC) IoC(Inversion of Control, 제어의 역전)는 프로그램의 흐름과 객체의 생

교내 축구 동아리 프로젝트 개요 [내부링크]

프로젝트 개요 교내 축구 동아리 프로젝트는 세종대학교(추후 학교 확장 예정)을 대상으로 축구 동아리를 만들고 다른 동아리와 경기 일정을 잡고 스쿼드를 짤 수 있는 프로젝트 앱의 기능은 크게 다음과 같다. 1. 로그인 (이때, 로그인은 세종대학교 학사정보시스템 API를 활용하여 진행하도록 설정) 2. 구단(교내 축구 동아리이지만 구단이라는 명칭을 사용) 생성 3. 일정 생성(일정의 정보, 경기 날짜, 경기 장소, 스쿼드) MSA로 진행하는 프로젝트이기 때문에 도메인별로 서버를 분리하기로 하였고 회원과 관련된 서버, 구단과 관련된 서버 두 가지로 서버를 나누어 진행 담당 업무 회원과 관련된 서버 구축 프로젝트 서버 구축 MSA 서버 구축을 위해 Netflix에서 제공하는 Eureka 클라우드 오픈 소스를 활용하여 서버를 구축할 예정입니다. 기본적으로 Eureka 서버를 가동하고 그 위에 Discovery 서버를 올려놓아 포워딩 작업을 진행합니다. Discovery 서버란 MSA(Micr

객체지향 프로그래밍(OOP) [내부링크]

OOP란 자바 프로그래밍은 객체지향 프로그래밍(Object Oriented Programming, OOP)의 대표적인 예로 간주됩니다. 객체지향 프로그래밍의 핵심 특성으로는 캡슐화, 추상화, 다형성, 상속성이 있으며, 이 네 가지 개념은 OOP를 이해하는 데 있어 기본적이고 중요한 요소입니다. OOP의 4가지 특징 1. 추상화(Abstraction) - 핵심적인 코드만 보여주기 2. 캡슐화(encapsulation) - 데이터 보호 3. 상속(inherutance) - 코드 재사용 4. 다형성(polymorphism) - 객체 변경 용이 추상화(Abstraction) - 핵심적인 코드만 보여주기 복잡한 실제 세계를 단순화하는 과정으로, 중요한 정보를 중심으로 간추리는 것을 의미합니다. 이를 통해 불필요한 세부사항을 제거하고 필요한 기능에만 집중할 수 있습니다. interface DiscountPolicy{ //할인되는 가격 반환 public int discount(Member mem

연결리스트(LinkedList) [내부링크]

LinkedList란 컴퓨터 프로그래밍에서 데이터를 저장하기 위해 우리는 변수를 사용합니다. 단일 변수는 하나의 데이터만 저장할 수 있기 때문에, 여러 데이터를 다룰 경우에는 그만큼 많은 변수가 필요합니다. C 언어와 같은 프로그래밍 언어에서는 배열을 사용하여 이 문제를 간단히 해결할 수 있습니다. 배열은 사용자가 지정한 수만큼의 변수를 한 번에 생성할 수 있게 해줍니다. 그러나 현실적으로 데이터의 개수가 가변적인 경우가 많으므로, 고정된 개수의 변수를 선언하는 배열은 항상 효율적이지 않습니다. 예를 들어, 100개의 데이터를 저장할 수 있는 배열을 선언했을 때 실제 사용하는 데이터가 10개 미만이라면 메모리가 낭비되고, 100개 이상이 필요한 경우에는 메모리가 부족해집니다. 이러한 문제를 해결하기 위해서는 데이터 수에 맞춰 메모리를 효율적으로 활용할 수 있는 자료구조가 필요한데, 이때 연결 리스트가 그 역할을 할 수 있습니다. 연결 리스트는 데이터 목록을 다루는 가장 기본적인 자료

Stack & Queue [내부링크]

Stack 스택(Stack)은 자료구조 중 하나로, 책을 차곡차곡 쌓는 것처럼 데이터를 쌓아 올리는 형태를 가집니다. 이 자료구조의 핵심은 LIFO(Last in First Out) 형식입니다. 즉, 가장 마지막에 들어온 데이터가 가장 먼저 나가는 구조를 가집니다. Stack의 특징 데이터는 스택의 최상단(top)을 통해서만 접근할 수 있습니다. 데이터를 스택에 추가하는 작업을 '푸시(push)'라고 하며, 이때 데이터는 top에 추가됩니다. 데이터를 스택에서 제거하는 작업을 '팝(pop)'이라고 하며, top에 위치한 데이터가 제거됩니다. 스택은 시간 순서에 따라 데이터가 쌓이기 때문에, 가장 최근에 삽입된 데이터가 가장 먼저 삭제됩니다. 이러한 구조를 후입선출(LIFO, Last-In-First-Out) 구조라고 합니다. Stack의 활용 분야 웹 브라우저의 방문기록: 가장 최근에 방문한 페이지부터 보여줍니다. 실행 취소(Undo) 기능: 가장 최근에 수행된 작업부터 취소합니다.

인프런 &lt;CPU 스케쥴링&gt; JAVA [내부링크]

* 인프런 CPU 스케쥴링 0번부터 n-1번까지 작업번호가 있는 n개의 작업이 있습니다. 각 작업은 [호출시간, 실행시간]으로 정보가 표현됩니다. 예를 들어 어떤 작업의 정보가 [2, 3] 이면 0초부터 시작하여 흐르는 시간에서 2초에 작업호출되어 대기상태에 들어가며 자 신의 차례가 되면 3초동안 실행된 뒤 종료됩니다. cpu는 다음과 같은 규칙에 의해서 작업을 실행시킵니다. 1) 한 번에 한 개의 작업을 할 수 있고, 한 번 실행된 작업은 중간에 멈추지 않습니다. 2) 대기상태에 있는 작업이 많을 경우 그 중 실행시간이 가장 작은 작업을 먼저 처리하며, 실 행시간이 같은 작업의 경우는 작업번호가 작은 것을 먼저 처리합니다. 3) cpu는 한 작업이 끝나면 바로 다른 작업을 할 수 있습니다. 만약 어떤 작업이 5초에 끝나 면 5초에 바로 다른 작업을 할 수 있습니다. 매개변수 tasks에 0번 작업부터 순서대로 각 작업의 정보가 주어지면 cpu가 처리하는 작업의 순서대로 작업번호를

옵티마이저(Optimizer) [내부링크]

옵티마이저(Optimizer) 옵티마이저는 DBMS의 핵심 구성 요소로, SQL 쿼리의 가장 효율적인 실행 방법을 결정하는 역할을 수행합니다. CPU가 컴퓨터의 두뇌라면, DBMS에서는 옵티마이저가 그에 해당한다고 볼 수 있습니다. 개발자가 SQL을 작성하고 실행할 때, 이 쿼리는 바로 실행되지 않습니다. 대신, 옵티마이저는 다양한 실행 계획을 수립하며, "이 SQL 쿼리를 어떻게 가장 효율적으로 실행할 것인가?"에 대한 방안을 모색합니다. 이후, 시스템의 통계 정보를 바탕으로 각 실행 계획의 예상 비용을 계산하고, 이들을 비교하여 가장 효율적인 계획을 선택합니다. 선택된 실행 계획에 따라 SQL 쿼리가 수행되며, 이 과정은 데이터베이스의 성능과 직결되기 때문에 매우 중요합니다. 이러한 과정을 통해 옵 티마이저는 데이터베이스의 자원을 최적으로 활용하고, 쿼리 응답 시간을 최소화하는 데 기여합니다. 옵티마이저의 종류 옵티마이저는 실행 계획을 세우는 방식에 따라 규칙 기반 옵티마이저와

프로그래머스 &lt;큰 수 만들기&gt; JAVA [내부링크]

* 프로그래머스 큰 수 만들기 코딩테스트 연습 - 큰 수 만들기 문제 설명 어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다. 예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다. 문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요. 제한 조건 number는 2... school.programmers.co.kr 이 문제는 주어진 숫자 문자열 number에서 k개의 숫자를 제거하여 만들 수 있는 가장 큰 숫자를 찾는 것입니다. 여기서 주어진 숫자는 문자열 형태로, 그리고 k는 제거해야 할 숫자의 개수입니다. 문제의 핵심은 최대한 큰 숫자를 유지하는 방

프로그래머스 &lt;구명보트&gt; JAVA [내부링크]

* 프로그래머스 구명보트 코딩테스트 연습 - 구명보트 무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명 씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다. 구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다. 사람들의 몸무게를 담은 배열 people과 구명... school.programmers.co.kr 문제는 무인도에 갇힌 사람들을 구명보트를 사용하여 구출하는 상황을 다룹니다. 구명보트는 한 번에 최대 2명만 태울 수 있고, 무게 제한이 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 1

인프런 &lt;겹쳐진 압축 해제&gt; JAVA [내부링크]

* 인프런 겹쳐진 압축 해 압축된 결과의 문자열이 주어지면 다시 원 상태로 압축을 해제하려고 합니다. 압축된 결과가 3(ab) 라고 주어지면 괄호안에 문자열이 3번 반복된 것을 압축했다는 의미입니 다. 이걸 원상태로 해제한 것은 “ababab”입니다. 만약 2(ab)k3(bc) 를 압축해제 하면 "ababkbcbcbc"입니다. 2(ab)k3(bc)에서 k문자와 같이 반 복횟수가 1인 경우는 숫자를 생략하고 압축되어 있습니다. 또한 겹쳐서 압축된 2(a2(b))을 압축해제하는 과정은 2(a2(b))-->2(abb)-->abbabb로 2(a2(b))를 압축해제한 결과는 abbabb입니다. 매개변수 s에 압축된 결과를 표현하는 문자열이 주어지면 원상태로 압축을 해제한 결과를 반 환하는 프로그램을 작성하세요. s answer "3(a2(b))ef" "abbabbabbef" "2(ab)k3(bc)" "ababkbcbcbc" "2(ab3((cd)))" "abcdcdcdabcdcdcd" "2(2

인덱스(index) [내부링크]

인덱스(index) 데이터베이스 인덱스는 검색 속도를 향상시키기 위해 설계된 특별한 자료구조입니다. 이는 데이터베이스 테이블의 특정 컬럼이나 컬럼 조합에 대한 값과 이 값들이 저장된 레코드의 위치를 매핑함으로써 데이터베이스 쿼리의 성능을 최적화합니다. 인덱스의 주요 역할은 데이터 검색 시 전체 테이블을 스캔하는 대신 필요한 레코드의 범위를 줄여 검색 속도를 높이는 것입니다. 인덱스 사용의 비유로, 책에서 원하는 내용을 찾는 과정을 들 수 있습니다. 책의 모든 페이지를 일일이 넘기며 찾는 것보다 목차나 색인을 사용해 찾는 것이 훨씬 빠릅니다. 마찬가지로, 데이터베이스에서 인덱스는 책의 목차나 색인과 유사한 역할을 하여 검색 과정을 신속하게 도와줍니다. 데이터베이스에서 대량의 데이터를 다룰 때, 인덱스는 특히 중요합니다. 인덱스를 활용하면 대규모 데이터를 효율적으로 검색할 수 있어, 검색 속도와 전반적인 성능이 크게 향상됩니다. 이처럼 인덱스는 데이터베이스의 효율성과 성능을 높이는 데

프로그래머스 &lt;섬 연결하기&gt; JAVA [내부링크]

* 프로그래머스 섬 연결하기 코딩테스트 연습 - 섬 연결하기 n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요. 다리를 여러 번 건너더라도, 도달할 수만 있으면 통행 가능하다고 봅니다. 예를 들어 A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다. 제한사항 섬의 개수 n은 1 이상 100 이하입니다. costs의 길이는 ((n-1) * n) / 2 이하입니다. 임의의 i에 대해, costs... school.programmers.co.kr 문제 설명: 여러 개의 섬(n개)이 있고, 각 섬들을 연결하는 다리 건설 비용(costs)이 주어집니다. 목표는 모든 섬들이 서로 통행 가능하게 최소 비용으로 다리를 건설하는 것입니다. 다리가 중간 섬을 통해 간접적으로 연결되어 있어도 통행 가능

프로그래머스 &lt;단속카메라&gt; JAVA [내부링크]

* 프로그래머스 단속카메라 코딩테스트 연습 - 단속카메라 고속도로를 이동하는 모든 차량이 고속도로를 이용하면서 단속용 카메라를 한 번은 만나도록 카메라를 설치하려고 합니다. 고속도로를 이동하는 차량의 경로 routes가 매개변수로 주어질 때, 모든 차량이 한 번은 단속용 카메라를 만나도록 하려면 최소 몇 대의 카메라를 설치해야 하는지를 return 하도록 solution 함수를 완성하세요. 제한사항 차량의 대수는 1대 이상 10,000대 이하입니다. routes에는 차량의 이동 경로가 포함되어 있으며 routes[i][0]에는 i번째 차량이 고속도로에 진입한 지점, routes[i][1]... school.programmers.co.kr 이 문제는 고속도로를 이동하는 차량들이 최소한 한 번은 단속 카메라를 만나도록 카메라를 설치하는 최적의 방법을 찾는 것입니다. 각 차량의 고속도로 진입 지점과 진출 지점이 주어지고, 이 정보를 사용하여 필요한 최소 카메라 수를 계산해야 합니다. 제한

인프런 &lt;현관문 출입 순서&gt; JAVA [내부링크]

* 인프런 현관문 출입 순서 현수가 다니는 회사 건물 1층에는 보안을 위한 작은 현관문이 있습니다. 이 현관문은 동시에 2명이상 출입이 불가능합니다. 1초에 한명씩만 출입을 할 수 있는 문입니 다. 0번부터 n-1번의 사원번호를 갖고 있는 사원이 현관문을 출입을 하는데 아래와 같은 규칙으 로 출입을 합니다. 1) 1초 전에 현관문을 사용한 적이 없으면 나가는 사원이 먼저 현관문을 이용합니다. 2) 1초 전에 나가는 사원이 현관문을 이용했다면 나가는 사원이 먼저 현관문을 이용합니다. 3) 1초 전에 들어오는 사원이 문을 이용했다면 들어오는 사원이 먼저 현관문을 이용합니다. 4) 같은 방향으로 가려고 하는 사람이 여러명이라면 그 중 사원번호가 가장 작은 사람이 우선 현관문을 이용합니다. 매개변수 arrival에 0번 사원부터 순서대로 현관문에 도착한 시간이 주어지고, state에 0번 사 원부터 순서대로 들어가는 사원인지, 나가는 사원이지 알려준다면, 각 사원이 현관문을 사용하 는 시간

Join의 종류 [내부링크]

JOIN JOIN 연산은 두 테이블을 결합하는 연산입니다. 데이터의 규모가 커지면서 하나의 테이블로 정보를 수용하기 어려워지면 테이블을 분할하고 테이블 간의 관계성을 부여합니다. 아래의 사람(people), 대학교(university) 두 테이블을 이용해 JOIN 연산을 해보겠습니다. JOIN의 종류 INNER JOIN: 두 테이블에서 공통으로 존재하는 값만을 결합합니다. 즉, 두 테이블의 교집합을 결과로 반환합니다. OUTER JOIN: 외부 조인은 세 가지 유형으로 나뉩니다: LEFT JOIN (LEFT OUTER JOIN): 왼쪽 테이블을 기준으로 데이터를 가져옵니다. 왼쪽 테이블의 모든 레코드와 오른쪽 테이블에서 일치하는 레코드가 반환됩니다. 일치하는 레코드가 없는 경우 왼쪽 테이블의 필드는 그대로 표시되고, 오른쪽 테이블의 필드는 NULL로 표시됩니다. RIGHT JOIN (RIGHT OUTER JOIN): 오른쪽 테이블을 기준으로 데이터를 가져옵니다. LEFT JOIN과

프로그래머스 &lt;N으로 표현&gt; JAVA [내부링크]

* 프로그래머스 N으로 표현 코딩테스트 연습 - N으로 표현 아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다. 12 = 5 + 5 + (5 / 5) + (5 / 5) 12 = 55 / 5 + 5 / 5 12 = (55 + 5) / 5 5를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다. 이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요. 제한사항 N은 1 이상 9 이하입니다. number는 1 이상 32,000 이하입니다. 수식... school.programmers.co.kr 이 문제는 특정 숫자 'N'과 'number'를 사용하여, N을 사칙연산을 이용해 'number'로 표현하는 방법 중에서 N을 사용하는 횟수가 최소가 되는 경우를 찾는 것입니다. 예를 들어, N이 5이고 number가 12일 때, 5를 여러 번

프로그래머스 &lt;정수 삼각형&gt; JAVA [내부링크]

* 프로그래머스 정수 삼각형 코딩테스트 연습 - 정수 삼각형 문제 설명 위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다. 삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요. 제한사항 삼각형의 높이는 1 이상 500 이하입니다. 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의... school.programmers.co.kr 이 정수 삼각형 문제의 해결 방법은 동적 프로그래밍(Dynamic Programming)을 사용하는 것입니다. 동적 프로그래밍은 복잡한 문제를 간단한 여러 하위 문제로 나누어 해결하는 방식으로, 각 하위 문제의 결과를 저장함으로써 중복 계산을 피

인프런 &lt;피부과&gt; JAVA [내부링크]

* 인프런 피부과 현수는 피부과를 운영합니다. 고객들이 레이저 시술을 받기위해 기다리는 대기실이 작다는 불 만이 접수되어 대기실을 확장하려고 합니다. 그래서 현수는 대기실에서 동시에 대기하는 최대 인원수를 알고 싶습니다. 매개변수 laser에 각 레이저 종류별 시술을 마치는데 필요한 시간(분), enter에 각 고객의 피부 과 방문시간과 해당 고객이 시술받을 레이저 종류 정보가 주어지면 시술을 받기 위해 대기실 에서 동시에 기다리는 최대인원이 몇 명 발생하는지 그 명수를 반환하는 프로그램을 작성하세 요. 레이저 시술이 끝난 고객은 바로 집으로 간다고 간주합니다. 현수는 한 번에 한 고객만 치료합니다. 치료순서는 피부과에 온 순서대로입니다. 고객이 피부 과에 온 시간은 모두 다릅니다. 입출력 예: 제한사항: • enter의 길이는 100,000을 넘지 않습니다. • enter 원소의 입력순은 시간순으로 주어집니다. • enter[i]의 첫 번째 문자열은 i번 고객이 방문한 시간, 두

DB Lock [내부링크]

데이터베이스는 데이터를 영속적으로 저장하는 시스템입니다. 이러한 시스템에서는 여러 사용자나 프로세스가 동시에 같은 자원(데이터)에 접근할 수 있으며, 이는 데이터의 오염이나 무결성 손상의 위험을 수반합니다. 데이터의 일관성과 무결성을 유지하기 위해, 데이터베이스 관리 시스템(DBMS)은 다양한 기술을 사용합니다. 이 중 하나가 'Lock'입니다. 예를 들어, 수강신청 시스템에서 한 강좌의 남은 정원이 1명일 때, 두 명의 학생이 거의 동시에 수강 신청 버튼을 누르는 경우를 생각해볼 수 있습니다. 이런 상황에서, 성공적인 신청은 단 한 명의 학생에게만 허용되어야 합니다. 이를 위해 DBMS는 'Lock' 메커니즘을 사용하여 동시 접근을 제어합니다. 'Lock'은 DBMS가 데이터에 대한 동시 접근을 관리하는 방법 중 하나입니다. 이 기술을 통해, 데이터베이스는 한 시점에 한 사용자만 특정 데이터 항목을 수정할 수 있도록 제한합니다. 이를 통해 데이터의 일관성을 보장하고 동시성 문제를

프로그래머스 &lt;등굣길&gt; JAVA [내부링크]

* 프로그래머스 등굣길 코딩테스트 연습 - 등굣길 계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다. 아래 그림은 m = 4, n = 3 인 경우입니다. 가장 왼쪽 위, 즉 집이 있는 곳의 좌표는 (1, 1)로 나타내고 가장 오른쪽 아래, 즉 학교가 있는 곳의 좌표는 (m, n)으로 나타냅니다. 격자의 크기 m, n과 물이 잠긴 지역의 좌표를 담은 2차원 배열 puddles이 매개변수로 주어집니다. 오른쪽과 아래쪽으로만 움직여 집에서 학교까지 갈 수 있는 ... school.programmers.co.kr 격자의 크기는 m x n이며, 각각의 값은 1 이상 100 이하의 자연수입니다. 시작점은 (1, 1)이며, 종점은 (m, n)입니다. 물에 잠긴 지역의 위치는 2차원 배열 puddles로 주어집니다. 오직 오른쪽 또는 아래쪽으로만 이동할 수 있습니다. 최단

프로그래머스 &lt;피로도&gt; JAVA [내부링크]

* 프로그래머스 피로도 코딩테스트 연습 - 피로도 XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던전 탐험을 마쳤을 때 소모되는 "소모 피로도"가 있습니다. "최소 필요 피로도"는 해당 던전을 탐험하기 위해 가지고 있어야 하는 최소한의 피로도를 나타내며, "소모 피로도"는 던전을 탐험한 후 소모되는 피로도를 나타냅니다. 예를 들어 "최소 필요 피로도"가 80, "소모 피로도"가 20인 던전을 탐험하기 위해서는 유저의 현재 남은 피로도는 8... school.programmers.co.kr * 문제풀이 이 문제를 봤을 때, DFS로 바로 풀 수 있다는 생각이 먼저 들지 않고 완전탐색으로 dungeon의 조합을 찾아내 풀어야겠다고 생각이 들었다. 먼저 pm 배열에 dungeons 입장 순서를 순열로 구하고 구한 입장 순서에 따라 dungeons

인프런 &lt;서로 다른 빈도수 만들기&gt; JAVA [내부링크]

* 인프런 서로 다른 빈도수 만들기 소문자로 이루어진 문자열이 주어지면 해당 문자열의 문자를 지워서 모든 문자의 빈도수가 서 로 다르게 만들려고 합니다. 만약 주어진 문자열이 "aaabbbcc" 라면 빈도수는 a:3 , b:3, c:2 이고 b문자를 1개, c문자 1 개를 지우면 a:3 , b:2, c:1 가 되어 빈도수가 모두 다르게 되고, 또는 b문자를 2개 지워도 a:3 , b:1, c:2가 되어 빈도수가 모두 다르게 됩니다. 매개변수 s에 문자열이 주어지면 s의 모든 문자의 빈도수가 서로 다르도록 하기 위해 지워야 할 최소 개수를 반환하는 프로그램을 작성하세요. 입출력 예: a answer "aaabbbcc" 2 "aaabbc" 0 "aebbbbc" 2 "aaabbbcccde" 5 "aaabbbcccdddeeeeeff" 8 제한사항: • 문자열 s의 길이는 10,000을 넘지 않습니다. * 문제풀이 import java.util.*; class Solution { public

프로그래머스 &lt;전략망을 둘로 나누기&gt; JAVA [내부링크]

* 프로그래머스 전력망을 둘로 나누기 코딩테스트 연습 - 전력망을 둘로 나누기 n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있습니다. 당신은 이 전선들 중 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할하려고 합니다. 이때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞추고자 합니다. 송전탑의 개수 n, 그리고 전선 정보 wires가 매개변수로 주어집니다. 전선들 중 하나를 끊어서 송전탑 개수가 가능한 비슷하도록 두 전력망으로 나누었을 때, 두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)를 return 하도록 solution 함수를 완성해주세요. 제한사항 n은 2 이상 100... school.programmers.co.kr 이 문제는 전력망을 구성하는 송전탑들과 이들을 연결하는 전선들이 주어졌을 때, 하나의 전선을 끊어 전력망을 두 부분으로 나누는 상황을 다룹니다. 목표는 이 두 부분의 송전탑 개수 차이를 가능한 한 최소화하는 것입니다. 주어진 조

프로그래머스 &lt;체육복&gt; JAVA [내부링크]

* 프로그래머스 체육복 코딩테스트 연습 - 체육복 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다. 전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 ... school.programmers.co.kr 체육복 문제는 학교에서 일부 학생들이 체육복을 도난당한 상황을 다룹니다. 전체 학생 수는 2명에서 30명 사이이며, 체육복을 도난당한 학생들과 여벌의 체육복을 가져온 학생들의 목록이 제공됩니다. 이 문제의 목표는 체육복을 잃어버린 학생들이 가능한 한 많이

인프런 &lt;최대 길이 연속 수열&gt; JAVA [내부링크]

* 인프런 최대 길이 연속 수열 최대 길이 연속수열 매개변수 nums에 정렬되지 않은 수열이 주어지면 수열의 원소로 만들 수 있는 가장 긴 연속 된 수열의 길이를 구하여 반환하는 프로그램을 작성하세요. 연속된 수열이란 1씩 증가하는 수열을 의미합니다. 만약 nums = [8, 1, 9, 3, 10, 2, 4, 0, 2, 3] 이면 이 수열의 원소로 만들 수 있는 가장 긴 연속된 수열은 [0, 1, 2, 3, 4]입니다. 입출력 예: nums answer [8, 1, 9, 3, 10, 2, 4, 0, 2, 3] 5 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0] 10 [3, 3, 3, 3, 3, 3, 3, 3] 1 [-3, -1, -2, 0, 3, 3, 5, 6, 2, 2, 1, 1] 7 [-5, -3, -1, -4, 3, 3, 5, 6, 2, 2, 1, 1, 7] 3 제한사항: • nums의 길이는 300,000을 넘지 않습니다. • nums[i]의 값은

Transaction (트랜잭션) [내부링크]

트랜잭션 트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다. 예시) 사용자 A가 사용자 B에게 만원을 송금한다 1. 사용자 A의 계좌에서 만원을 차감한다: UPDATE를 통해 사용자 A의 잔고 변경 2. 사용자 B의 계좌에 만원을 추가한다: UPDATE를 통해 사용자 B의 잔고 변경 작업 단위: 출금 UPDATE + 입금 UPDATE => 통틀어 하나의 트랜잭션이라고 한다. - 위 두 쿼리문이 모두 성공적으로 완료되어야만 하나의 작업 완료 트랜잭션의 특징 트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위이다. 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업 단위이다. 하나의 트랜잭션은 Commit 되거나 Rollback된다. 트랜잭션의 성질 (ACID) 트랜잭션의 ACID 속성은 데이터베이스 관리 시스템(D

앱 배포 서버 분리 (RDS + Elastic Beanstalk) [내부링크]

앱을 배포하기 직전에 Dev와 Production으로 서버와 DB를 분리할 필요가 있었다. 앱 배포 환경의 서버는 Elastic Beanstalk을 활용하고 있고 DB는 RDS의 MySQL를 활용하고 있다. * 서버 환경 분리 서버 환경 분리를 위해 새로운 Elastic Beanstalk을 팠다. 그러나 어차피 개발 환경에서만 사용할 것이기 때문에 굳이 Auto Scaling을 적용하지 않고 하나의 인스턴스만을 구성할 수 있도록 서버 환경을 구축했다. SpringBoot 내에서도 Dev와 Production을 분리하기 위해 YML 파일을 분리해주었다. 공통적인 설정은 동일하게 남겨두고 YML 파일의 경우 active: local 로 구성하여 개발 환경에서는 local로 구동될 수 있도록 설정해 주었다. spring: profiles: # active: production active: local group: local: local production: production YML파일을

프로그래머스 &lt;디스크 컨트롤러&gt; JAVA [내부링크]

* 프로그래머스 디스크 컨트롤러 코딩테스트 연습 - 디스크 컨트롤러 하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를들어 - 0ms 시점에 3ms가 소요되는 A작업 요청 - 1ms 시점에 9ms가 소요되는 B작업 요청 - 2ms 시점에 6ms가 소요되는 C작업 요청 와 같은 요청이 들어왔습니다. 이를 그림으로 표현하면 아래와 같습니다. 한 번에 하나의 요청만을 수행할 수 있기 때문에 각각의 작업을 요청받은 순서대로 처리하면 다음과 같이 처리 됩니다. - A: 3ms ... school.programmers.co.kr * 문제풀이 import java.util.*; class Solution { public int solution(int[][] jobs) { int n = jobs.length; LinkedList<int[]> programs = new

프로그래머스 &lt;가장 큰 수&gt; JAVA [내부링크]

* 프로그래머스 가장 큰 수 코딩테스트 연습 - 가장 큰 수 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요. 제한 사항 numbers의 길이는 1 이상 100,000 이하입니다. numb... school.programmers.co.kr * 문제풀이 import java.util.*; class Solution { public String solution(int[] numbers) { int n = numbers.length; String[] str = new String[n];

DB & DBMS & SQL [내부링크]

데이터베이스(Database) 데이터베이스는 관련성이 있는 데이터의 집합입니다. 이 데이터는 구조화되어 있어서 쉽게 접근, 관리, 업데이트할 수 있습니다. 예를 들어, 학교의 데이터베이스는 학생, 강의, 교수에 대한 정보를 저장할 수 있습니다. 전자적으로(electronically) 저장되고 사용되는 관련있는(related) 데이터들의 조직화된 집합(organized collection) DBMS(Database Management Systems) 데이터베이스는 많은 데이터가 모여 있는 '데이터의 집합'으로 정의할 수 있습니다. 이러한 데이터베이스를 효율적으로 관리하고 운영하는 소프트웨어가 바로 DBMS(데이터베이스 관리 시스템)입니다. DBMS의 핵심 기능 중 하나는 데이터베이스를 여러 사용자나 응용 프로그램이 공유하고 동시에 접근할 수 있게 하는 것입니다. 예를 들어, 은행의 예금 계좌 정보를 저장하는 데이터베이스를 생각해 볼 수 있습니다. 이 데이터베이스에는 수많은 고객들의 예

이상 현상(Anomaly) & ERD와 정규화 과정 [내부링크]

이상 현상(Anomaly) 관계형 데이터베이스 설계에서 정보의 이상 현상을 방지하는 것은 중요합니다. 이상 현상은 데이터를 삽입, 수정, 삭제할 때 논리적 오류가 생기는 것을 말하며, 주로 갱신 이상, 삽입 이상, 삭제 이상으로 구분됩니다. 학번 이름 나이 성별 강의코드 강의명 전화번호 1011 이태호 23 남 AC1 데이터베이스 개론 010-2627-8123 1012 강민정 20 여 AC2 운영체제 010-4665-1941 1013 김현수 21 남 AC3 자료구조 010-5223-4464 1013 김현수 21 남 AC4 웹 프로그래밍 010-5223-4464 1014 이병철 26 남 AC5 알고리즘 010-6305-2912 1. 삽입 이상 : 자료를 삽입할 때 의도하지 않은 자료까지 삽입해야만 자료를 테이블에 추가가 가능한 현상 강의를 아직 수강하지 않은 새로운 학생을 삽입할 경우 강의 코드와 강의명 속성에는 null값이 들어가야 하는 문제가 생깁니다. 2. 갱신 이상 : 중복된

프로그래머스 &lt;소수 찾기&gt; JAVA [내부링크]

* 프로그래머스 소수 찾기 코딩테스트 연습 - 소수 찾기 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요. 제한사항 numbers는 길이 1 이상 7 이하인 문자열입니다. numbers는 0~9까지 숫자만으로 이루어져 있습니다. "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다. 입출력 예 numbers return "1... school.programmers.co.kr * 문제풀이 import java.util.*; class Solution { public int solution(String numbers) { Set<Integer> permutation = new HashSet<>(); permutation("

프로그래머스 &lt;전화번호 목록&gt; JAVA [내부링크]

* 프로그래머스 전화번호 목록 코딩테스트 연습 - 전화번호 목록 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조대 : 119 박준영 : 97 674 223 지영석 : 11 9552 4421 전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요. 제한 사항 phone_b... school.programmers.co.kr 문제의 요지를 파악하자면 phone_book이라는 배열이 들어왔을 때, 어떠한 값이 다른 값의 접두어가 되면 False를 반환하고 그렇지 않으면 True를 반환하는 문제이다. 문제의 특징은 전화번호이지만 String[] 타입으로 인자가 주어졌

프로그래머스 &lt;의상&gt; JAVA [내부링크]

* 프로그래머스 의상 코딩테스트 연습 - 의상 코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다. 예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다. 종류 이름 얼굴 동그란 안경, 검정 선글라스 상의 파란색 티셔츠 하의 청바지 겉옷 긴 코트 코니는 각 종류별로 최대 1가지 의상만 착용할 수 있습니다. 예를 들어 위 예시의 경우 동그란 안경과 검정 선글라스를 동시에 착용할 수는 없습니다. 착용한 의상의 일부가 겹치더라도, 다른 의상이 겹... school.programmers.co.kr clothes의 2차원 배열이 들어왔을때(의상의 이름, 의상의 종류), 가능한 의상의 조합의 수를 구하는 문제이다. 처음 문제를 보았을 때, 본능적으로 HashMap을 활용하여 문제를 풀어야겠다는 생각을 했지만 재귀로 구하는 조합의 수와 어떻게 알고리즘을 섞어

인프런 &lt;좌석 번호&gt; JAVA [내부링크]

* 인프런 좌석번호 세계 최고의 알고리즘 전문가인 현수의 강연을 보기위해 많은 사람들이 찾아왔습니다. 강연장에는 가로로 c개, 세로로 r개의 좌석이 c×r격자형태로 배치되어 있다. 각 좌석의 번호는 해당 격자의 좌표 (x,y)로 표시된다. 아래 그림은 가로 6개, 세로 5개 좌석으로 구성된 6×5격자형 좌석배치입니다. 각 격자에 표시 된 (x,y)는 해당 좌석의 번호를 말합니다. 가장 왼쪽 아래의 좌석번호는 (1,1)이며, 가장 오른 쪽 위 좌석의 번호는 (6, 5)이다. (1, 5) (2, 5) (3, 5) (4, 5) (5, 5) (6, 5) (1, 4) (2, 4) (3, 4) (6, 4) (1, 3) (2, 3) (6, 3) (1, 2) (2, 2) (6, 2) (1, 1) (2, 1) (3, 1) (4, 1) (5, 1) (6, 1) 사람들은 온 순서대로 (1,1)위치 좌석부터 시작하여 시계방향으로 돌아 들어가면서 빈 좌석에 앉습니다. 만약 5번째로 온 사람은 (1, 5)좌

인프런 &lt;최대길이 바이토닉 수열&gt; JAVA [내부링크]

* 인프런 최대길이 바이토닉 수열 바이토닉 수열이란 수열이 증가했다가 감소하는 수열을 의미합니다. 예를 들어 1, 2, 3, 2, 1과 같이 증가했다가 감소하면 바이토닉 수열이라고 합니다. 하지만 1, 2, 3, 4, 5와 같이 증가만 하거나, 5, 4, 3, 2, 1처럼 감소만 하면 바이토닉 수열이라 하지 않습니다. 또 1, 2, 2, 3, 2, 1처럼 같은 값이 이웃해도 바이토닉 수열이라 하지 않습니다. 매개변수 nums에 길이가 n인 수열이 주어지면 이 수열의 연속부분수열 중 가장 긴 바이토닉 수열을 찾아 그 길이를 반환하는 프로그램을 작성하세요. 만약 [1, 3, 2, 5, 7, 4, 2, 5, 1]수열이 주어지면 이 수열의 연속부분수열 중 가장 긴 바이토 닉 수열은 [2, 5, 7, 4, 2]이고, 답은 5입니다. 제한사항: • nums의 길이 3 <= n <= 10,000 • 배열 nums의 원소는 자연수입니다. * 문제풀이 import java.util.*; class

Firebase Service Key JSON 파일 SECRET 배포 (Github Actions + Create-JSON) [내부링크]

서버 배포 환경에서 REPO를 PUBLIC으로 전환하기 위해 설정 파일들을 SECRET으로 돌려야 하는 작업을 진행해야 했다. YML 파일 같은 경우 SECRET을 통해 Base64로 인코딩한 이후에 Github Actions에서 Set YML을 통해 YML 파일을 설정해었다. 그러나, JSON 파일의 경우 YML 파일과 마찬가지로 Base64를 통해 인코딩 한 이후 Decode 하도록 Github Actions를 설정해주니 JSON 파일이 생성되지 않는 문제가 발생하였다. JSON 파일의 경우 Github Actions의 Create-JSON을 활용하여 설정 파일을 만들어주어야 했다. create-json - GitHub Marketplace Create an JSON file from secret or a string of a json github.com GitHub Actions에서 jsdaniell/[email protected] 액션을 사용하여 JSON 파일을 생성하는 방

프로그래머스 &lt;베스트앨범&gt; JAVA [내부링크]

* 프로그래머스 베스트앨범 코딩테스트 연습 - 베스트앨범 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. 노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return... school.programmers.co.kr 이 프로그램은 스트리밍 사이트에서 장르별로 가장 많이 재생된 노래를 두 개씩 선정해 베스트 앨범을 구성하는 것을 목표로 합니다. 각 노래는 고유 번호로 구분되며, 선정 기준은 다음과 같습니다: 가장 많이 재생된 장르를 우선적으로 선택합니다. 장르 내

프로그래머스 &lt;주식가격&gt; JAVA [내부링크]

* 프로그래머스 주식가격 코딩테스트 연습 - 주식가격 초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,000 이하인 자연수입니다. prices의 길이는 2 이상 100,000 이하입니다. 입출력 예 prices return [1, 2, 3, 2, 3] [4, 3, 1, 1, 0] 입출력 예 설명 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다. 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다. 3초 시점... school.programmers.co.kr 이 문제는 주식의 가격이 초 단위로 기록된 배열 prices를 주어지며, 각 시점에서 주식 가격이 떨어지지 않은 기간을 초 단위로 계산하는 것입니다. 배열의 각 원소는 특정 시점에서의 주식 가격을 나타내며, 이 가격이 얼마나 오랫동안 떨어지지 않았는지를

인프런 &lt;과일 가져가기&gt; JAVA [내부링크]

* 인프런 과일 가져가기 현수네 반에는 1번부터 n번까지 학생번호를 가진 n명의 학생이 있습니다. 모든 학생의 책상에는 사과, 배, 귤이 담긴 A, B, C 세 바구니가 놓여 있습니다. A바구니는 사과만 담고, B바구니는 배만 담고, C바구니는 귤만 담습니다. 각 학생은 책상에 있는 세 바구니 중 하나를 가질 수 있습니다. 단 이 세 바구니 중 가장 적게 과일이 담겨있는 바구니를 가집니다. 예를 들어 현수의 책상에 14, 17, 14개가 각각 바구니에 담겨 있다면 현수는 사과(14개) 또는 귤(14개) 중 하나를 가져갑니다. 즉 현수는 14개의 과일을 가져가는 것입니다. 모든 학생은 딱 한 번 바구니의 과일 한 개를 다른 학생과 교환할 수 있는 기회가 있습니다. 교환하는 규칙은 다음과 같습니다. 1) 1번 학생부터 번호 순으로 교환을 할 건지 결정합니다. 2) 교환을 하는 양쪽 학생이 서로 이득이 되면 무조건 교환을 합니다. 즉 양쪽이 모두 가져가 는 과일의 개수가 원래 가져가려고

Softeer &lt;수퍼바이러스&gt; JAVA [내부링크]

* Softeer 수퍼바이러스 Softeer - 현대자동차그룹 SW인재확보플랫폼 수퍼바이러스 난이도 Lv. 3 제출 2,045 명 참가자 452 명 정답률 19.60 % 지원 언어 JavaScript C C++ Java Python C# Kotlin Go Swift 문제 풀이하기 로그인 후 문제풀이가 가능합니다. 문제설명 제출 이력 연습문제 톡 언어별 시간/메모리 언어 시간 메모리 JavaScript 2초 256MB C 1초 256MB C++ 1초 256MB Java 2초 256MB Python 2초 256MB C# 2초 256MB Kotlin 2초 256MB Go 2초 256MB Swift 2초 256MB 수... softeer.ai 이 문제는 수퍼바이러스의 지수적 성장을 계산하는 것에 관한 것입니다. 수퍼바이러스는 초당 P배의 비율로 증가하며, 이 증가율은 0.1초마다 적용됩니다. 즉, N초 동안 수퍼바이러스의 개수는 매 0.1초마다 P배씩 증가한다는 것을 의미합니다. 따라서 N

국회 공공데이터 활용 경진대회 [내부링크]

국회 공공데이터 활용 경진대회 웹앱 프로젝트 개발 국회 공공데이터 활용 경진대회는 열린국회정보 Open API를 활용한 ICT 경진대회이다. 우리는 우리 지역의 국회의원이 누구인지 어떤 이력을 가지고 당선 이후 어떤 행보를 가지고 있는지 찾기 힘들다. 이 점을 공략하여 국회 공공데이터 활용 경진대회 방향성을 잡았다. 먼저, 역대 국회의원의 인적사항 API를 통해 지역구의 국회의원이 누구인지에 대한 정보와 인적사항을 확인할 수 있게 Main 화면을 구성할 예정이다. 이후, 국회의원의 공약집을 통해 Cloud Vision API를 활용하여 키워드를 추출하고 국회의원 SNS API를 활용해 현재 국회의원의 활동 중 공약과 관련된 활동을 확인할 수 있도록 가닥을 잡았다. 사용할 국회 Open API 데이터는 아래와 같다. 1.국회의원 인적사항 https://open.assembly.go.kr/portal/data/service/selectAPIServicePage.do/OWSSC600113

국회의원 SNS 정보 OpenAPI [내부링크]

국회의원의 공약집을 확인하고 키워드 추출을 통해 SNS에서 공약과 관련되어 무슨 활동을 하고 있는지 확인하기 위해 열린국회정보 Open API에서 국회의원 SNS 정보 API를 활용하기로 하였다. 먼저 API의 메타 정보를 확인하면 아래와 같은데 다른 공공데이터를 볼 때 항상 최종 수정일자가 너무 옛날이라 데이터의 활용가치가 없다고 생각했었다. 그러나 이거는 매일매일 수정되는것 같으니 지속적으로 활용하기에도 좋은 데이터라 이용해볼 가치가 있다. 먼저 API의 구성을 보면 아래와 같은데 기본인자 값만 넘겨주고 이름, 국회의원코드 같은 요청인자는 넘겨주지 않고 전부 받아올 생각이다. Service 계층에서의 기본적으로 JSON 값을 가져오는 코드는 아래와 같다. Constant 변수로 하드코딩을 진행하지 않고 상수값들을 전부 분리해주었다. @Service @Transactional public class CongressService { public String requestData()

국회의원 인적사항 Open API [내부링크]

국회의원 SNS 정보 API에 이어 국회의원 인적사항 API를 이용하였다. 국회의원 인적사항 열린국회정보 Open API의 경우 국회의원별 소속정당, 위원회, 재선여부, 당선대수 등 인적정보를 제공한다. 이 API 또한 최종 수정 날짜가 2023-11-28일자로 나중에 서비스를 확장해 나가기 좋을 것 같아 이 API를 선정하였다. SNS 정보 API와 마찬가지로 필수 정보만 Request로 보내 국회의원의 정보를 가져오도록 하였다. 또한, SNS 정보 데이터 관리 방법과 마찬가지로 데이터베이스에 매일 저녁 6시마다 업데이트 하도록 코드를 구현하였다. 기본적인 로직은 SNS Service와 틀이 똑같다. CongressPersonalInfo Entity를 아래와 같이 구성했다. 다만 String으로 MEM_TITLE을 설정하니까 길이가 너무 길어 DB에 저장할 수가 없었다. 이를 해결하기 위해 ColumnDefinition을 TEXT로 변경하였다. MySQL에서 TEXT 타입은 큰 문

국회의원 공약 API [내부링크]

국회의원의 공약을 모아놓은 Open API를 종일 찾았는데 존재하지 않았다. 중앙선거관리위원회에서 하는 정책 공약마당에서 당선인 공약을 확인할 수 있었는데 국회의원들의 공약이 PDF 파일로 존재했다. 국회의원의 공약집 중에서 공약이 쓰여 있는 부분만 PNG 파일로 만들어 S3에 저장해서 클라이언트에서 지역을 입력 받으면 S3 버킷에서 저장한 공약집 사진을 반환하도록 구현하였다. 먼저 기본적인 DB 구축을 위해 CongressPromise Entity를 아래와 같이 구현하였다. @Entity @Getter @Setter @AllArgsConstructor @NoArgsConstructor @Builder public class CongressPromise { @Id @GeneratedValue(generator = "uuid2") @GenericGenerator( name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator" ) @Colum

친구 그룹(FriendGroup) API 리팩토링 [내부링크]

친구 그룹은 사용자가 친구 목록 중 선택하여 그룹을 만들 수 있는 서비스 기능이다. 그룹의 정보만을 담고 있어 Member와 1:N 연관관계 매핑이 되어있다. (이 때 외래키는 owner로 그룹을 만든 장본인이다.) 그룹에 들어 있는 Member 목록 같은 경우는 FriendGroupMember Entity에서 따로 관리하도록 설계하였다. 그룹 생성 API 리팩토링 /** * Create group response create group. * * @param requestCreateGroup the request create group * @return the response create group */ public ResponseCreateGroup createGroup(RequestCreateGroup requestCreateGroup) { Member owner = returnMember(requestCreateGroup.getOwnerId()); validateGroupMem

Nginx 고용량 이미지 업로드 오류 해결 (SpringBoot + Android Studio + AWS S3 + Elastic Beanstalk) [내부링크]

* 문제 발견 FE와 이미지 업로드 통신을 진행하는 과정에서 413 Request Entity Too Long이라는 오류가 발생하였다. SpringBoot의 YML 파일에서 spring-multipart-max-file-size와 spring-multipart-max-request-size 를 100MB로 설정해주었고 로컬 환경에서는 S3가 문제가 없었지만 Elastic Beanstalk의 배포 환경에서는 이와 같은 오류가 발생하였다. * 원인 파악 원인은 용량이 큰 파일을 업로드하려고 해서이다. nginx로 reverse proxy를 사용할 때 용량이 큰 파일을 업로드하면 에러를 낸다. nginx의 default 값은 1MB이다. * 추가적인 학습 Nginx란 무엇인가? Nginx는 높은 성능과 안정성 그리고 현재 가장 많이 사용되고 있는 웹 서버입니다. Apache 같은 웹 서버와 비교하면 더 가볍고, 대규모 애플리케이션 처리에 적합하다는 장점이 있습니다. 보통 웹 서비스는 클라

사용자 검색 기록(Search History) API 리팩토링 [내부링크]

사용자 검색 기록 기능은 사용자가 일정을 추가할때, 위치 정보를 검색할 수 있다. 이 때 검색한 위치 정보를 저장하는 기능을 구현하는 클래스가 사용자 검색 기록(Search History) 클래스이다. 사용자 검색 기록 저장 API 리팩토링 사용자 검색 기록 API의 경우는 간단하다. Member로부터 searchHistory를 받고 저장한다. 당연히 Member는 여러 검색기록이 존재할 수 있으므로 ManyToOne으로 연관관계 매핑을 해주었다. 아래는 기존의 사용자 검색 기록 저장 API 로직이다. /** * Set search history. * * @param requestSearchHistory the request search history */ public ResponseSaveSearchHistory setSearchHistory(RequestSearchHistory requestSearchHistory){ Member findMember = memberReposito

제네릭 기법, Vector, ArrayList [내부링크]

제네릭(generic) 클래스나 메소드를 형판에서 찍어내듯이 생산할 수 있도록 일반화된 형판을 만드는 기법 컬렉션 자바 인터페이스와 클래스 Vector<E> <E>에 사용할 요소의 특정 타입으로 구체화 배열을 가변 크기로 다룰 수 있게 하는 컨테이너 -> 배열의 길이 제한 극복 -> 요소의 개수가 넘치면 자동으로 길이 조절 3. Vector에 삽입 가능한 것 -> 객체, NULL -> 기본 타입의 값은 Wrapper 객체로 만들어 저장 4. Vector에 객체 삽입 -> 벡터의 맨 뒤, 중간에 객체 삽입 가능 5. Vector에서 객체 삭제 -> 임의의 위치에 있는 객체 삭제 가능 Vector<Integer> 벡테 컬렉션 내부 Vector<E> 클래스의 주요 메소드 ArrayList<E> 가변 크기 배열을 구현한 클래스 -> <E>에 요소로 사용할 특정 타입으로 구체화 2. 벡터와 거의 동일 -> 요소 삽입, 삭제, 검색 등 벡터 기능과 거의 동일 -> 벡터와 달리 스레드 동기화 기

Iterator, HashMap [내부링크]

컬렉션의 순차 검색을 위한 Iterator Iterator <E> 인터페이스 -> 리스트 구조의 컬렉션에서 요소의 순차 검색을 위한 인터페이스 2. Iterator 객체 얻어내기 -> 컬렉션의 iterator() 메소드 호출 -> 해당 컬렉션을 순차 검색할 수 있는 Iterator 객체 리턴 HashMap<K, V> 키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션 -> K: 키로 사용할 요소의 타입 -> V: 값으로 사용할 요소의 타입 -> 키와 값이 한 쌍으로 삽입 -> '값'을 검색하기 위해서는 반드시 '키' 이용 2. 삽입 및 검색이 빠른 특징 -> 요소 삽입: put() 메소드 -> 요소 검색: get() 메소드 3. 예) HashMap<String, String> 생성, 요소 삽입, 요소 검색 HashMap<String, String>의 내부 구성 HashMap<String, String> map = new HashMap<String, String>()

웹 서버, 웹 어플리케이션 서버 [내부링크]

웹 - HTTP 기반 모든 것이 HTTP - HTTP 메시지에 모든 것을 전송 HTML, TEXT, IMAGE, 음성, 영상, 파일, JSON, XML(API) 거의 모든 형태의 데이터 전송 가능 서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용 웹 서버(Web Server) HTTP 기반으로 동작 정적 리소스 제공, 기타 부가기능 정적(파일) HTML, CSS, JS, 이미지, 영상 예) NGINX, APACHE 웹 애플리케이션 서버(WAS - Web Application Server) HTTP 기반으로 동작 웹 서버 기능 포함 + (정적 리소스 제공 가능) 프로그램 코드를 실행해서 애플리케이션 로직 수행 -> 동적 HTML, HTTP API(JSON) -> 서블릿, JSP, 스프링 MVC 예) 톰캣(Tomcat) Jetty, Undertow 웹 시스템 구성 - WAS, DB WAS가 너무 많은 역할을 담당, 서버 과부하 우려 가장 비싼 애플리케이션 로직이 정적 리소스 때문에

멀티 쓰레드 [내부링크]

쓰레드 애플리케이션 코드를 하나하나 순차적으로 실행하는 것은 쓰레드 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행 쓰레드가 없다면 자바 애플리케이션 실행이 불가능 쓰레드는 한번에 하나의 코드 라인만 수행 동시 처리가 필요하면 쓰레드를 추가로 생성 요청마다 쓰레드 생성 장점 -> 동시에 요청을 처리할 수 있다. -> 리소스(CPU, 메모리)가 허용할 때 까지 처리 가능 -> 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작한다. 2. 단점 -> 쓰레드는 생성 비용이 너무 비싸다. (고객의 요청이 올때마다 쓰레드를 생성하면, 응답 속도가 늦어진다.) -> 쓰레드는 컨텍스트 스위칭 비용이 발생한다. -> 쓰레드 생성에 제한이 없다. (고객 요청이 너무 많으면, CPU/메모리 임계점을 넘어서 서버가 죽을 수 있다.) 쓰레드 풀 - 요청마다 쓰레드 생성의 단점 보완 특징 -> 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다. -> 쓰레드 풀에 생성 가능한 쓰레드의

HTML, HTTP API, CSR, SSR [내부링크]

정적 리소스 고정된 HTML 파일, CSS, JS, 이미지, 영상 등을 제공 주로 웹 브라우저 HTML 페이지 동적으로 필요한 HTML 파일을 생성해서 전달 웹 브라우저: HTML 해석 HTTP API HTML이 아니라 데이터를 전달 주로 JSON 형식 사용 다양한 시스템에서 호출 다양한 시스템에서 호출 데이터만 주고 받음, UI 화면이 필요하면 클라이언트가 별도 처리 앱, 웹 클라이언트, 서버 to 서버 다양한 시스템 연동 주로 JSON 형태로 데이터 통신 UI 클라이언트 접점 -> 앱 클라이언트 (아이폰, 안드로이드, PC 앱) -> 웹 브라우저에서 자바스크립트를 통한 HTTP API 호출 -> React, Vue.js 같은 웹 클라이언트 서버 to 서버 -> 주문 서버 to 결제 서버 -> 기업간 데이터 통신 서버사이드 렌더링, 클라이언트 사이드 렌더링 SSR - 서버 사이드 렌더링 -> HTML 최종 결과를 서버에서 만들어서 웹 브라우저에 전달 -> 주로 정적인 화면에 사용

리스트의 구현, 배열 [내부링크]

List 리스트(List)는 일련의 동일한 타입의 항목(item)들 실생활의 예: 학생명단, 시험 성적, 서점의 신간 서적, 상점의 판매 품목, 실시간 급상승 검색어등 리스트의 구현 -> 1차원 배열 -> 단순연결리스트 -> 이중연결리스트 -> 원형연결리스트 배열 배열(Array)은 동일한 타입의 원소들이 연속적인 메모리 공간에 할당되어 각 항목이 하나의 원소엥 저장되는 기본적인 자료구조이다. 특정 원소에 접근할 때에는 배열의 인덱스를 이용하여 O(1) 시간에 접근할 수 있다. 새 항목이 배열 중간에 삽입되거나 중간에 있는 항목을 삭제하면, 뒤 따르는 항목들을 한 칸씩 뒤로 또는 앞으로 이동시켜야 하므로 삽입이나 삭제 연산은 항상 O(1) 시간에 수행할 수 없다. Overflow 배열은 미리 정해진 크기의 메모리 공간을 할당 받은 뒤 사용해야 하므로, 빈자리가 없어 새 항목을 삽입할 수 없는 상황(overflow) 발생 Overflow가 발생하면 에러 처리를 하여 프로그램을 정지시키

01. Spring Data JPA [내부링크]

1. 쇼핑몰 프로젝트 생성하기 Thymeleaf: 서버에서 가공한 데이터를 뷰에 보여주기 위한 템플릿 엔진으로 타임리프 의존성을 추가한다. Sping Data JPA: Spring Data JPA는 JPA를 쉽게 구현할 수 있도록 도와주는 모듈입니다. MySQL Driver: 프로젝트에서 사용할 데이터베이스는 MySQL로 의존성을 추가한다. H2 Database: H2 Database는 자바 기반의 관계형 데이터베이스로 매우 가볍고 빠른 데이터베이스입니다. 디스크 기반의 데이터 저장뿐만 아니라 메모리 내에 데이터를 저장하는 인메모리 데이터베이스 기능을 지원합니다. 2. 상품 엔티티 설계하기 엔티티 관련 어노테이션 ※ CLOB과 BLOB의 의미 CLOB이란 사이즈가 큰 데이터를 외부 파일로 저장하기 위한 데이터 타입입니다. 문자형 대용량 파일을 저장하는데 사용하는 데이터 타입이라고 생각하면 됩니다. BLOB은 바이너리 데이터를 DB 외부에 저장하기 위한 타입입니다. 이미지, 사운드,

02. 회원가입, 로그인/로그아웃 [내부링크]

1. 스프링 시큐리티 설정하기 스프링 시큐리티를 사용하기 위해 의존성을 추가해줍니다. //Security, LoginValidation implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation', version: '2.5.6' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.security:spring-security-test' implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' 이렇게 했을 시 모든 요청에 인증을 필요로 하지만 SecurityConfig.java의 configure 메소드에 설정을 추가하지 않으면 요청에 인증을 요구하지 않습니다. SecurityConf

03. 페이지 권한 설정하기 [내부링크]

ADMIN 계정만 접근할 수 있는 상품 등록 페이지를 생성하고 ItemController 클래스를 작성합니다. ItemController -----------코드 생략----------- @Controller public class ItemController { @GetMapping("/admin/item/new") public String itemForm(){ return "item/itemForm"; } } 인증되지 않은 사용자가 리소스를 요청할 경우 "Unauthorized" 에러를 발생하도록 AuthenticationEntryPoint 인터페이스를 구현합니다. CustomAuthenticationEntryPoint -----------코드 생략----------- public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpSer

04. 연관 관계 매핑 [내부링크]

01. 연관 관계 매핑 종류 일대일(1:1): @OneToOne 일대다(1:N): @OneToMany 다대일(N:1): @ManyToOne 다대다(N:M): @ManyToMany 02. 일대일 단방향 매핑하기 장바구니(Cart) 엔티티를 만들고 회원 엔티티와 연관 관계 매핑을 설정합니다. 장바구니 엔티티가 일방적으로 회원 엔티티를 참조하고 있습니다. 장바구니와 회원은 일대일로 매핑 돼 있으며, 장바구니 엔티티가 회원 엔티티를 참조하는 일대일 단방향 매핑입니다. 애플리케이션을 실행하면 콘솔창에 cart 테이블이 생성되는 쿼리문이 실행되는 것을 볼 수 있습니다. cart 테이블은 member_id 컬럼을 외래키로 갖습니다. 테이블을 먼저 생성하는 쿼리문이 실행되고 member_id를 foreign key로 지정하는 쿼리문이 실행됩니다. 장바구니 엔티티와 회원 엔티티의 매핑을 맺어주면 장바구니 엔티티를 조회하면서 회원 엔티티의 정보도 동시에 가져올 수 있는 장점이 있습니다. CartRep

05. 영속성 전이 [내부링크]

1. 영속성 전이란 영속성전이란 엔티티의 상태를 변경할 때 해당 엔티티와 연관된 엔티티의 상태 변화를 전파시키는 옵션입니다. 이때 부모는 One에 해당하고 자식은 Many에 해당합니다. 예를 들어 Order 엔티티가 삭제되었을 때 해당 엔티티와 관련되어 있는 OrderItem 엔티티를 한꺼번에 저장할 수 있습니다. 영속성 전이 옵션을 무분별하게 사용할 경우 삭제되지 말아야 할 데이터가 삭제될 수 있으므로 조심해서 사용해야 합니다. 영속성 전이 옵션은 단일 엔티티에 완전히 종속적이고 부모 엔티티와 자식 엔티티의 라이프 사이클이 유사할 때 cascade 옵션을 활용합니다. OrderRepository 인터페이스를 생성합니다. OrderRepository -----------코드 생략----------- public interface OrderRepository extends JpaRepository<Order, Long> { } @OneToMany 어노테이션에 cascade 옵션을 설정

JPA 소개 [내부링크]

JPA? 1. Java Persistence API 2. 자바 진영의 ORM 기술 표준 ORM Object-relational mapping(객체 관계 매핑) 객체는 객체대로 설계 관계형 데이터베이스는 관계형 데이터베이스대로 설계 ORM 프레임워크가 중간에서 매핑 대중적인 언어에는 대부분 ORM 기술이 존재 JPA는 애플리케이션과 JDBC 사이에서 동작 JPA 동작 저장 2. 조회 JPA는 표준 명세 JPA는 인터페이스의 모음 JPA 2.1 표준 명세를 구현한 3가지 구현체 하이버네이트, EclipseLink, DataNucleus JPA를 왜 사용해야 하는가? SQL 중심적인 개발에서 객체 중심으로 개발 생산성 유지보수 패러다임의 불일치 해결 성능 데이터 접근 추상화와 벤더 독립성 표준 2-1) 생산성 - JPA와 CRUD 3-1) 유지보수 - 기존: 필드 변경시 모든 SQL 수정 -> JPA: 필드만 추가하면 됨, SQL은 JPA가 처리 JPA와 패러다임의 불일치 해결 JPA와

User Service API 구현 [내부링크]

1. User 도메인 클래스 생성 User -----------코드 생략----------- @Data @AllArgsConstructor @RequiredArgsConstructor public class User { private Integer id; private String name; private Date joinDate; } UserDaoService -----------코드 생략----------- @Service @AllArgsConstructor public class UserDaoService { private static List<User> users = new ArrayList<>(); private static int usersCount = 3; static { users.add(new User(1, "Kenneth", new Date())); users.add(new User(2, "Alice", new Date())); users.add(new User(3

RESTful Service 기능 확장 [내부링크]

1. 유효성 체크를 위한 Validation API 사용 User -----------코드 생략----------- @Size(min = 2, message = "Name은 2글자 이상 입력해 주세요.") private String name; @Past private Date joinDate; User -----------코드 생략----------- @PostMapping("/users") public ResponseEntity<User> createUser(@Valid @RequestBody User user){ User savedUser = service.save(user); URI location = ServletUriComponentsBuilder.fromCurrentRequest() .path("/{id}") .buildAndExpand(savedUser.getId()) .toUri(); return ResponseEntity.created(location).build()

Microservice와 Spring Cloud의 소개 [내부링크]

1. Cloud Native Architecture 확장 가능한 아키텍처 - 시스템의 수평적 확정에 유연 - 확장된 서버로 시스템의 부하 분산, 가용성 보장 - 시스템 또는, 서비스 애플리케이션 단위의 패키지 (컨테이너 기반 패키지) - 모니터링 탄력적 아키텍처 - 서비스 생성 - 통합 - 배포, 비즈니스 환경 변화에 대응 시간 단축 - 분헐할된 서비스 구조 - 무상태 통신 프로토콜 - 서비스의 추가와 삭제 자동으로 감지 - 변경된 서비스 요청에 따라 사용자 요청 처리 (동적 처리) 장애 격리 (Fault isolation) - 특정 서비스에 오류가 발생해도 다른 서비스에 영향 주지 않음 2. Cloud Native Application 지속적인 통합, CI (Continuous Integration) - 통합 서버, 소스 관리 (SCM), 빌드 도구, 테스트 도구 - ex) Jenkins, Team CI, Travis CI 지속적인 배포 - Continuous Delivery -

06. 상품 등록 및 수정 [내부링크]

1. 상품 등록하기 상품의 이미지를 저장하는 상품 이미지 엔티티를 만듭니다. 상품 이미지 엔티티는 이미지 파일명, 원본 이미지 파일명, 이미지 조회 경로, 애표 이미지 여부를 갖도록 설계합니다. ItemImg -----------코드 생략----------- @Entity @Table(name = "item_img") @Getter @Setter public class ItemImg extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "item_img_id") private Long id; private String imgName; private String oriImgName; private String imgUrl; private String repimgYn; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") p

단순연결리스트로 구현한 리스트 [내부링크]

1. 단순연결리스트 단순연결리스트(Singly Linked List)는 동적 메모리 할당을 이용해 리스트를 구현하는 가장 간단한 형태의 자료구조 동적 메모리 할당을 받아 노드(node)를 저장하고, 노드는 레퍼런스를 이용해 다음 노드를 가리키도록 만들어 노드들을 한 줄로 연결시킴 연결리스트에서는 삽입이나 삭제 시 항목들의 이동이 필요 없음 배열의 경우 최초에 배열의 크기를 예측하여 결정해야 하므로 대부분의 경우 배열에 빈 공간ㅇ르 가지고 있으나, 연결리스트는 빈 공간이 존재하지 않음 연결리스트에서는 항목을 탐색하려면 항상 첫 노드부터 원하는 노드를 찾을 때까지 차례로 방문하는 순차탐색 (Sequential Search)을 해야 함 2. 단순연결리스트의 노드를 위한 Node 클래스 Node 객체는 항목을 저장할 item과 Node 레퍼런스를 저장하는 next를 가짐 3. 리스트를 단순연결리스트로 구현한 SList 클래스 SList 생성자는 연결리스트의 첫 노드를 가리키는 head를 n

이중연결리스트 [내부링크]

1. 이중연결리스트 이중연결리스트(Doubly Linked List)는 각 노드가 두 개의 레퍼런스를 가지고 각각 이전 노드와 다음 노드를 가리키는 연결리스트 단순연결리스트는 삽입이나 삭제할 때 반드시 이전 노드를 가리키는 레퍼런스를 추가로 알아내야 하고, 역방향으로 노드들을 탐색할 수 없음 이중연결리스트는 단순연결리스트의 이러한 단점을 보완하나, 각 노드마다 추가로 한 개의 레퍼런스를 추가로 저장해야 한다는 단점을 가짐 2. 이중연결리스트의 노드를 위한 DNode 클래스 3. 이중연결리스트를 위한 DList 클래스 head, tail, size를 가지는 DList 객체로, 생성자에서 head에 연결리스트의 첫 노드를 가리키는 레퍼런스를 저장 tail: 연결리스트의 마지막 노드를 가리키는 레퍼런스를 저장 head와 tail이 가리키는 노드는 생성자에서 아래와 같이 초기화. 이 두 노드들은 실제로 항목을 저장하지 않는 Dummy 노드 insertBefore()메소드: 새 노드를 인자로

07. 상품관리하기 [내부링크]

1. 상품 관리하기 상품 관리 화면에서는 상품을 조회하는 조건을 설정 후 페이징 기능을 통해 일정 개수의 상품만 불러오며, 선택한 상품 상세 페이지로 이동할 수 있는 기능까지 구현해봅니다. 조회 조건으로 설정할 값은 다음과 같습니다. 상품 등록일 상품 판매 상태 상품명 또는 상품 등록자 아이디 이때 쿼리를 동적으로 쉽게 생성하고 비슷한 쿼리를 재활용하기 위해 Querydsl을 사용합니다. Querydsl을 사용하기 위해 build.gradle의 dependency와 plugin을 수정합니다. buildscript { ext { queryDslVersion = "5.0.0" } } // QueryDSL 설정 start def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } c

원형연결리스트 [내부링크]

1. 원형연결리스트 원형연결리스트 (Circular Lilnked List)는 마지막 노드가 첫 노드와 연결된 단순연결리스트 원형연결리스트에서는 마지막 노드의 레퍼런스가 저장된 last가 단순연결리스트의 head와 같은 역할 마지막 노드와 첫 노드를 O(1) 시간에 방문할 수 있는 장점 리스트가 empty가 아니면 어떤 노드도 null 레퍼런스를 가지고 있지 않으므로 프로그램에서 null 조건을 검사하지 않아도 되는 장점 원형연결리스트에서는 반대 방향으로 노드들을 방문하기 쉽지 않으며, 무한 루프가 발생할 수 있음에 유의할 필요 [원형연결리스트의 응용] 여러 사람이 차례로 돌아가며 하는 게임을 구현하는데 적합한 자료구조 많은 사용자들이 동시에 사용하는 컴퓨터에서 CPU 시간을 분할하여 작업들에 할당하는 운영체제에 사용 이항힙(Binomial Heap)이나 피보나치힙(Fibonacci Heap)과 같은 우선순위큐를 구현하는 데에도 원형연결리스트가 부분적으로 사용 2. 원형연결리스트를

트랜잭션 [내부링크]

트랜잭션이란 쪼갤 수 없는 업무의 최소 단위 쇼핑몰 사이트에서 물건을 주문한다면 1) 주문 기록을 저장하고 2) 포인트를 저장하고 3) 결제 기록을 저장해야 한다 그런데 만약 중간에서 에러가 난다면 예컨데 주문기록과 포인트는 있는데, 결제 기록이 없는 상황이 생길 수도 있다. 이러한 문제를 해결하기 위해 나온 해답은 모든 SQL을 성공시키거나, 하나라도 실패하면 모두 실패하는걸로 만드는 것이다. 트랜잭션 시작하기: start transaction; 트랜잭션 정상 종료하기 (SQL 반영): commit; 트랜잭션 실패 처리하기 (SQL 비반영): rollback; 결국 묶어서 저장된다는 의미이다. Client1이 DB에 유저 A를 저장한다고 했을때 트랜잭션이 시작된다. 저장하고 있는 코드가 진행되고 있을 때 Client2가 전체 유저 조회를 하지만 아직 Client1이 유저 A를 저장한다는 SQL이 반영되지 않았고 Client2는 A 유저를 확인할 수 없다. 결국 코드를 작성할 때 S

영속성 컨텍스트 [내부링크]

영속성 컨텍스트란 테이블과 배핑된 Entity 객체를 관리/보관하는 역할 스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료 영속성 컨텍스트의 특수 능력 변경 감지 (Dirty Check) - 영속성 컨텍스트 안에서 불러와진 Entity는 명시적으로 save하지 않아도, 변경을 감지해 자동으로 저장된다. 2. 쓰기 지연 - DB의 INSERT/UPDATE/DELETE SQL을 바로 날리는 것이 아니라, 트랜잭션이 commit될 때 한번에 날린다. 3. 1차 캐싱 - ID를 기준으로 Entity를 기억한다 이렇게 캐싱된 객체는 완전히 동일하다.

01. 도서관리 애플리케이션의 요구사항 [내부링크]

사용자 도서관의 사용자를 등록할 수 있다. (이름 필수, 나이 선택) 도서관 사용자의 목록을 볼 수 있다. 도서관 사용자 이름을 업데이트 할 수 있다. 도서관 사용자를 삭제할 수 있다. 책 도서관에 책을 등록 및 삭제할 수 있다. 사용자가 책을 빌릴 수 있다 (단, 다른 사람이 그 책을 빌렸다면 빌릴 수 없다.) 사용자가 책을 반납할 수 있다.

02. 유저 생성 API 개발 [내부링크]

도서관 사용자를 등록할 수 있다. (이름 필수, 나이 선택) HTTP MethodL POST HTTP Path: /user HTTP Body (JSON) 결과 반환 X (HTTP 상태 200 OK이면 충분하다) HTTP Path: /user로 들어오는 user의 값을 POST 형식으로 userCreateRequest 객체로 받아 userRepository에 저장한다. 각각에 해당되는 DTO / Controller / Service / Repository를 순서대로 만든다. @Getter @Setter public class UserCreateRequest { private String name; private Integer age; } @RestController public class UserController { private final UserService userService; @Autowired public UserController(UserService userServic

03. 유저 조회 API 개발 [내부링크]

유저 조회 API 스펙 HTTP Mehtod: GET HTTP Path: /user 쿼리: 없음 결과 반환 X Service / Controller를 차례로 추가한다. public List<User> getUsers(){ return userRepository.findAll(); } @GetMapping("/user") public List<User> getUsers(){ return userService.getUsers(); } POSTMAN으로 확인한다.

04. 유저 업데이트, 삭제 API 개발 [내부링크]

1. 도서관 사용자 이름을 업데이트 할 수 있다. HTTP Method: PUT HTTP Path: /user HTTP Body (JSON) 결과 반환 X (HTTP 상태 200 OK) DTO / Service / Controller 계층에 메소드를 추가한다. DTO @Getter @Setter public class UserUpdateRequest { private long id; private String name; } Service public void updateUser(UserUpdateRequest request) { User findUser = userRepository.findById(request.getId()) .orElseThrow(EntityExistsException::new); findUser.setName(request.getName()); userRepository.save(findUser); } Controller @PutMapping("/user")

05. 책 생성 API 개발 [내부링크]

요구사항: 도서관에 책을 등록할 수 있다. API 스펙 - HTTP Method: POST - HTTP Path: /book - HTTP Body(Json) - 결과 반환 X (HTTP 상태 200 OK -> 추후에 변경 가능) 패키지 구성은 아래와 같이 한다. Book Entity 객체를 생성한다. @Entity @Table(name = "book") @Getter @Setter @ToString public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "book_id") private Long id; @Column(nullable = false) private String name; } BookRepository를 생성한다. public interface BookRepository extends JpaRepository<Book, Long> { } DTO를 생성한다. @Get

06. 대출 기능 개발하기 [내부링크]

요구사항 - 사용자가 책을 빌릴 수 있다. 다른 사람이 그 책을 진작 빌렸다면, 빌릴 수 없다. API 스펙 확인 - HTTP Method: POST - HTTP Path: /book/loan - HTTP Body (JSON) - 결과 반환 X (HTTP 상태 200 OK이면 충분하다) 요구사항을 보니 지금 테이블로는 충분하지 않다 - 유저의 대출 기록을 저장하는 새로운 테이블이 필요하다 - user_loan_history 테이블을 추가한다. user_loan_history table이 아래와 같이 되어 있을때, 2번 유저는 2권의 책을 빌렸고 클린코드는 반납했고 테스트 주도 개발은 대출중이라는 것을 확인할 수 있다. UserLoanHistory 엔티티와 Repository를 만든다. @Entity @Table(name = "user_loan_history") @Getter @Setter public class UserLoanHistory { @Id @GeneratedValue(st

07. 베포란 무엇인가 [내부링크]

배포: 최종 사용자에게 SW를 전달하는 과정 도서관리 애플리케이션의 현재 상황 우리 컴퓨터에 우리가 작성한 코드, 스프링, MySQL등이 모두 있다 친구 (최종 사용자)가 우리의 서버를 쓸 수 있는 방법으로 생각해본다고 하면 친구의 컴퓨터를 이용해 우리 컴퓨터에 접속하는 방안이 있을 수 있다. 그러나 이러한 문제는 우리 컴퓨터가 24시간 동안 켜져 있지 않다는 것이다. 또한 우리 컴퓨터는 스프링, MySQL 외에도 문서 편집기, 게임, 비디오 재생 등을 처리한다. 결국 이러한 문제점들 때문에 전용 컴퓨터에 코드를 옮기고 스프링, MySQL 등을 설치해 친구가 접속하게 하는 방법이 있다. 결론적으로 배포란 전용 컴퓨터에 우리의 서버를 옮겨 실행시키는 것이다. 이러한 전용 컴퓨터를 위해 미국 쇼핑몰 아마존이 운영하는 AWS (Amazon Web Service)를 이용한다. AWS에서 전용 컴퓨터를 빌릴 때 알아두어야 할 점은 우리가 컴퓨터를 살 때 운영체제(OS)도 같이 선택한다. 서버

08. profile과 H2 DB [내부링크]

배포를 할 때 전용 컴퓨터(리눅스)에 설치한 java / mysql을 실행한다. 전용 컴퓨터에서 실행된 서버는 전용 컴퓨터에 있는 mysql을 사용한다. 똑같은 서버 코드를 실행시키지만, 우리 컴퓨터에서 사용할 때는 우리 컴퓨터의 MySQL 전용 컴퓨터에서 사용할 때는 전용 컴퓨터의 MySQL H2 DB란? - 경량 Database로, 개발 단계에서 많이 사용하며 디스크가 아닌 메모리에 데이터를 저장할 수 있다. -> 메모리에 데이터를 저장하면 휘발되기 때문에 개발단계에서만 사용된다. - 개발 단계에서는 테이블이 계속 변경되는데 어차피 데이터가 휘발되기 때문에 ddl-auto 옵션을 create로 주면 테이블을 신경쓰지 않고 코드에만 집중할 수 있다. - 개발 단계에서는 데이터가 휘발되는 H2가 오히려 장점이다. 이때 PROFILE을 이용해 똑같은 서버 코드를 실행시키지만, local이라는 profile을 입력하면, H2 DB를 사용하고 dev라는 profile을 입력하면 MySQL

09. git과 github [내부링크]

1. git이란 무엇인가 코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램 개발자 A와 개발자 B가 각각 기능1, 4를 맡아서 개발한다고 생각해보자 그렇게 각자 개발한 버전 A와 버전 B가 있을 것이다. 결국 마지막에 하나로 합쳐야한다. git으로 인해 버전 A와 B를 합칠 수 있다. git 기초 명령어 정리 2. github이란 무엇인가 git으로 관리되는 프로젝트의 코드가 저장되는 저장소 git이 관리하는 프로젝트를 github에 저장할 수 있다. github에 코드를 저장하는 이유는 내 컴퓨터에 있는 코드는 모종의 이유로 소실될 수 있다. 또한 배포할 때 활용할 수 있다. 정리하자면 git: 코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램 github: git으로 관리되는 프로젝트의 코드가 저장되는 저장 라고 할 수 있다.

배열로 구현한 스택 [내부링크]

1. 스택(stack) 한 쪽 끝에서만 item(항목)을 삭제하거나 새로운 item을 저장하는 자료구조 새 item을 저장하는 연산: push Top item을 삭제하는 연산: pop 후입 선출(Last-in First-Out, LIFO) 원칙하에 item의 삽입과 삭제 수행 배열로 구현된 스택 단순 연결리스트로 구현된 스택 2. 배열로 구현한 ArrayStack 클래스 peek() 메소드: 스택이 top에 있는 item을 리턴 만일 스택이 empty일 때는 EmptyStackException을 발생시켜 예외 발생 에러 메시지 출력 후 프로그램 종료 push() 메소드: 새 item을 스택에 삽입 overflow가 발생하면 resize() 메소드를 호출하여 배열의 크기를 2배로 확장 pop() 메소드: 스택 top item을 삭제 후 리턴

'Cannot construct instance of ~~' 에러 [내부링크]

AuthenticationFilter 아래의 코드에서 발생한 에러 RequestLogin creds = new ObjectMapper().readValue(request.getInputStream(), RequestLogin.class); 기본 생성자만 만들어주면 된다. ObjectMapper가 @RequestBody를 바인딩할 때 기본 생성자를 사용하기 때문이다. @NoArgConstructor를 붙여준다. @Data @NoArgsConstructor public class RequestLogin { @NotNull @Size(min = 2, message = "Email not be less than two characters") @Email private String email; @NotNull @Size(min = 2, message = "Password must be equals or greater than 8 characters") private String passwor

JJWT 라이브러리 설치 에러 [내부링크]

runtimeOnly group dependency를 추가해주면 된다. implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.2' runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.2' runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.2'

Spring Boot로 개발하는 RESTful Service [내부링크]

1. REST API란 RESTful API란 RESTful API란 Representational State Transfer의 약어인 REST 아키텍처 스타일을 따르는 API를 말합니다. 즉, RESTful API는 REST 아키텍처 스타일을 기반으로 설계된 API입니다. RESTful API는 HTTP 프로토콜을 이용하여 클라이언트와 서버 간 통신을 수행합니다. 클라이언트는 HTTP 메서드를 이용하여 서버의 리소스에 접근하며, 서버는 HTTP 응답 코드와 함께 데이터를 반환합니다. RESTful API의 특징은 다음과 같습니다. 자원 지향적 (Resource Oriented) 모든 자원에 고유한 ID가 존재하고, 이를 이용하여 자원을 구분합니다. 메시지 기반 (Message Oriented) 클라이언트와 서버 간 메시지를 주고받아 통신합니다. 자체 표현 (Self-describing) 메시지에는 리소스에 대한 정보가 포함되어 있으며, 이를 통해 리소스에 대한 자체 표현력을 가집니

User Service API 구현 [내부링크]

1. User 도메인 클래스 생성 아직 JPA와 연동하지 않고 간단하게 설계하겠습니다. DB를 사용하지 않고 List에 저장하여 가져오는 식으로 설계합니다. 고정적으로 List에 저장할 User 3개를 만들어준다. findAll() method: List에 있는 모든 User들을 반환한다. save() method: List<User>에 user를 저장한다. findOne() method: id의 일치 여부를 확인해 확인된 id를 가진 user를 반환한다. @Service public class UserDaoService { private static List<User> users = new ArrayList<>(); private static int usersCount = 3; // 고정적으로 List에 저장할 User 3개를 만들어준다. static { users.add(new User(1, "Euics", new Date())); users.add(new User(2, "Boo

1-2주차: 기계학습 개요 [내부링크]

AI, Machine Learning, 그리고 Deep Learning AI (Artifical Intelligence)는 컴퓨터로 만들어진 지능으로 "사람에 의해 통상적으로 수행되는 지적인 작업을 자동화 하는 것을 목표"(Chollet, 2018)로 하는 학문 영역임 또한 4차 산업혁명의 핵심인 machine learning과 deep learning을 포괄하는 보다 광범위한 개념임 AI (artificial intelligence)는? 통게학이랑 인공지능이랑 연관이 많이 되어 있음 Machine Learning 부호적 AI 에어컨과 같은 규칙 위주의 AI들은 부호적 AI의 예시이다. ML (Machine learning) 기계학습은 데이터를 기반으로 통계적 추측을 실행한다. 예를들어 고양이/강아지 사진들이 있을때 고양이와 강아지 사진의 특징을 뽑아서 예측한다. 통계적 머신러닝과 딥러닝 통계적 머신러닝과 딥러닝의 자료 크기와 정밀도의 관계는 아래의 그래프와 같다. 통계적인 머신러닝

RESTful Service 기능 확장 [내부링크]

1. 유효성 체크를 위한 Validation API 사용 Validation API란 Validation API는 자바에서 객체의 유효성을 검증하는 데 사용되는 API입니다. 이 API를 사용하면 애플리케이션에서 사용하는 객체의 값이나 상태가 올바른지 검증할 수 있습니다. Validation API는 다양한 제약 조건(Constraint)을 정의하여 객체의 속성에 대한 유효성 검증을 수행할 수 있습니다. 예를 들어, @NotNull, @Size, @Min, @Max, @Email과 같은 제약 조건을 정의할 수 있습니다. Validation API를 사용하려면 객체의 필드에 제약 조건 애노테이션을 지정하고, 검증할 때는 Validator 인터페이스를 사용합니다. Validator 인터페이스는 객체를 검증하고 검증 결과를 반환하는 메서드들을 제공합니다. Validation API는 자바 표준 스펙이며, 자바 빈즈(JavaBeans) 표준 스펙과 함께 사용됩니다. 자바 빈즈는 객체의 구성

Spring Boot API 사용 [내부링크]

1. Level3 단계의 REST API구현을 위한 HATEOAS 적용 HATEOAS란 HATEOAS는 "Hypermedia as the Engine of Application State"의 약어로, RESTful API 디자인의 한 가지 방법론입니다. 이 방법론에서는, API의 리소스와 상태 전이에 대한 정보를 hypermedia 링크를 통해 제공하여 클라이언트가 API와 상호작용할 때 필요한 정보를 전달합니다. 즉, HATEOAS를 사용하면 클라이언트는 리소스에 대한 요청을 보내고, 해당 리소스와 상호작용할 수 있는 다음 가능한 단계의 링크를 수신합니다. 이렇게 하면 클라이언트는 API의 리소스에 대한 상태를 이해하고, 그에 따라 적절한 조치를 취할 수 있습니다. 예를 들어, RESTful API에서는 클라이언트가 자원을 수정하는 데 필요한 정보와 함께 PUT 또는 PATCH 요청을 수행해야합니다. 그러나 HATEOAS를 사용하면 클라이언트는 수정 가능한 자원에 대한 링크를 수신

[swagger] Failed to start bean 'documentationPluginsBootstrapper' [내부링크]

Spring boot에서 swagger를 사용하기 위해 아래와 같이 추가하고 서버를 실행하니 하니 아래와 같은 오류가 발생했다. // https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0' org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException Spring boot 2.6버전 이후에 spring.mvc.pathmatch.matching-strategy 값이 ant_apth_matcher에서 path_pattern_parser

Spring Security를 이용한 인증 처리 [내부링크]

Spring Security란 Spring Security는 Spring 프레임워크 기반의 웹 애플리케이션 보안 솔루션으로, 인증(Authentication)과 권한 부여(Authorization)를 제공합니다. Spring Security는 웹 애플리케이션의 보안 요구 사항을 간단하고 효과적으로 해결할 수 있도록 다양한 보안 기능과 API를 제공합니다. Spring Security의 핵심 기능은 다음과 같습니다. 인증(Authentication) 기능: 사용자 인증 기능을 제공합니다. Spring Security는 기본적으로 다양한 인증 방식을 제공하며, 커스텀 인증 방식도 구현할 수 있습니다. 권한 부여(Authorization) 기능: 인증된 사용자가 특정 자원에 접근할 권한이 있는지 확인하는 기능을 제공합니다. 보안 기능: 웹 애플리케이션의 보안에 관련된 기능을 제공합니다. 예를 들어, CSRF 공격 방어, XSS 공격 방어, HTTP 보안 등의 기능을 제공합니다. 세션 관리

Spring Security VS JWT 토큰 [내부링크]

Spring Security와 JWT 토큰 Spring Security는 인증과 권한 부여를 처리하기 위한 프레임워크로, JWT(JSON Web Token)를 사용하지 않고도 사용할 수 있습니다. Spring Security는 다양한 인증 방식을 지원하며, 기본적으로는 세션 기반 인증을 사용합니다. 세션 기반 인증은 서버 측에서 세션 정보를 관리하고, 세션 ID를 클라이언트에게 전달하여 인증을 유지하는 방식입니다. 그러나 JWT는 세션 기반 인증과 달리, 클라이언트 측에서 토큰 정보를 관리하며, 서버는 토큰의 유효성만 검사하면 됩니다. 이는 서버의 확장성과 분산 환경에서의 이점을 제공합니다. 따라서 JWT를 사용하면 세션 기반 인증보다 더 유연하고 확장성 있는 인증 방식을 구현할 수 있으며, Spring Security에서도 JWT를 사용하는 방법을 제공합니다. 하지만 JWT를 사용하지 않고도 Spring Security를 사용할 수 있으며, 사용자의 요구 사항과 상황에 따라 다양한

2-1주차: 기계학습 개요 [내부링크]

3. 평가와 예측 평가를 한다는것을 결국 모델이 얼마나 결과가 잘 나오는지 확인을 하는 것이다. Training dataset에서는 예측을 잘하지만 Test dataset은 잘 예측하지 못하는건 과대적합이라고 할 수 있다. 이 때, 모든 데이터를 수집할 수 없기 때문에 일반화 능력이 중요하다. 예를들어, Test dataset에 있는 처음보는 강아지/고양이 사진이더라도 결정을 잘 내려주어야 한다는 것이다. 앞선 일련의 과정을 통해 선택된 모형을 학습에 이용하지 않았던 test dataset 에 적합 시켜 generalization error를 계산하여 over-fitting (또는 underfitting) 여부를 평가하는 것이다. 과대적합의 해결책으로는 통계적 머신러닝에서 L1 또는 L2 규제화가 있다. 결론적으로 지금까지 1-2주차에 걸쳐 진행했던 기계학습의 과정들을 도식화하면 아래와 같다. Machine Learning 방법들 Machine Learning의 방법들은 아래와 같다

1주차 [내부링크]

생명(生命)이란? 1. 생명 : 생명체가 살아서 숨쉬고 활동할 수 있는 힘. 2. 생명체 : 살아있는 것, 즉 생명현상을 영위하는 것. 생명체는 어떤 특징을 가지나? 1. 조직화 2. 환경에 대한 반응과 항상성 3. 생장과 발생 4. 물질대사 5. 생식 6. 진화적 적응 생명체는 어떻게 구성되어 있나? 원자에서 생물까지 ; 생물로 조직화 분자 -> 세포소기관 -> 세포 -> 조직 -> 기관과 기관계 생물에서 생태계까지 ; 기능적 생태계로 조직화 기관과 기관계 -> 생물 개체 -> 개체군 -> 군집 -> 생태계 -> 생물권 생체내에서 발견되는 원소들 산소(O) > 탄소(C) > 수소(H) > 질소(N) 생명체를 구성하는 분자에는 어떤 것이 있나? 생명체에서 가장 많은 성분: 물 생체분자(biological molecule) : 단백질, 탄수화물, 핵산, 지질 구성분자 1) 구성분자의 종류 (1) 생체분자(biological molecule) : 단백질, 탄수화물, 핵산, 지질 (2

2-1주차 [내부링크]

지질 1) 지질(lipid)이란 (1) 물에 녹지 않는 탄화수소(CH2)n로서 분자 내에 많은 비극성 공유결합으 로 이루어진 분자. (2) 지질은 소수성(hydrophobic) 분자. (3) 에너지를 많이 포함. 2) 지질의 종류 (1) 트리글리세리드 (중성지방) ① 모두 단순지질로서 트리글리세리드는 글리세롤(glycerol) 한 분자가 3분자의 지방산 (fatty acid)과 탈수축합반응 (에스터결합)으로 공유결합된 형태. ② 상온에서 고체인 트리글리세리드를 지방 (fat), 액체인 것은 기름(oil). ③ 포화지방산 (saturated fatty acid) : 탄화수소 사슬의 탄소와 탄소 사이의 결합이 모두 단일 결합인 지방산 ④ 불포화지방산 (unsaturated fatty acid) : 탄화수소 사슬의 탄소 사이의 결합 중 하나 이상의 이중 결합을 갖는 지방산 ⑤ 트렌스지방 (trans fat, trans fatty acids) : 불포화지방산으로 분류. 불포화지방산을 고체

Java Persistence API 개요 [내부링크]

JPA JPA는 Java Persistence API의 약어입니다. Java Persistence API는 Java EE 및 Java SE 환경에서 관계형 데이터베이스를 다루기 위한 자바 ORM(Object-Relational Mapping) 프레임워크입니다. JPA는 데이터베이스의 데이터와 자바 언어의 객체 간의 매핑을 담당하며, 객체를 데이터베이스에 저장하고 검색하거나 수정 및 삭제하는 등의 작업을 쉽게 수행할 수 있도록 지원합니다. JPA는 일반적으로 ORM 기술 중 하나로 분류되며, Hibernate, EclipseLink, OpenJPA 등의 구현체가 있습니다. JPA를 사용하면 개발자는 SQL 쿼리를 작성하지 않고도 데이터베이스 조작을 수행할 수 있으며, 객체 지향적인 개발을 하면서도 데이터베이스에 대한 접근과 조작이 가능해집니다. 이로 인해 개발 생산성과 유지보수성이 향상되며, 코드의 가독성이 높아지는 장점이 있습니다. Hibernate Hibernate는 자바 객체 관

Spring Data JPA를 이용한 Entity설정과 초기 데이터 설정 [내부링크]

@Entity 어노테이션을 이용하여 만들었던 User 도메인을 h2-DB와 연동시켜줍니다. User 클래스의 코드는 아래와 같습니다. 이때 user가 예약어가 되어있기 때문에 Entity name을 users로 설정해줍니다. @Data @AllArgsConstructor @NoArgsConstructor // @JsonIgnoreProperties(value = {"password"}) // @JsonFilter("UserInfo") @ApiModel(description = "사용자 상세 정보를 위한 도메인 객체") @Entity(name = "users") public class User { @Id @GeneratedValue @Column(name = "users_id") private Integer id; @Size(min = 2, message = "Name은 두글자 이상 입력해주세요.") @ApiModelProperty(notes = "사용자의 이름을 입력해 주세요.")

Error creating bean with name 'dataSourceScriptDatabaseInitializer' ... [내부링크]

Error creating bean with name 'dataSourceScriptDatabaseInitializer' ... H2 Database가 2.1.212 버전에서 user 키워드가 예약어로 지정되어 해당 버전 이후부턴 user라는 테이블 생성이 이제 안된다. h2 버전의 이유라면 다음과 같이 3가지 방법으로 해결할 수 있다. 방법 1. H2 Database Version을 2.1.212 ---> 1.4.200으로 변경. 방법 2. properties.yml의 url에 NON_KEYWORDS=USER 설정 추가 spring: datasource: url: jdbc:h2:mem:testdb;NON_KEYWORDS=USER 방법 3. 테이블 이름 변경 > Table이름을 User -> Users로 변경. > data.sql의 user -> users로 변경.

JdbcSQLIntegrityConstraintViolationExceptionUnique index or primary key violation [내부링크]

JdbcSQLIntegrityConstraintViolationException Unique index or primary key violation 이건 프로그래밍 실수로 인해 발생할 수 있는 오류입니다. Primary나 Unique 제약조건을 설정한 컬럼에 대해 그 제약조건을 위반했을 때 발생합니다. PK로 설정된 컬럼의 어떤 값이 DB에 이미들어 있는데 또 insert하려는 경우 등이 이에 해당합니다. 로그를 보면 자세한 원인까지 출력됩니다.

JPA Service 구현을 위한 Controller, Repository 생성 [내부링크]

JpaRepository란 JpaRepository는 Spring Data JPA에서 제공하는 인터페이스 중 하나로, JPA(Java Persistence API) 기반의 데이터 액세스를 쉽게 구현할 수 있도록 도와줍니다. JpaRepository 인터페이스는 CRUD(Create, Read, Update, Delete) 메서드와 정렬, 페이징, 동적 쿼리 생성 등의 기능을 제공합니다. 이를 통해 개발자는 간단하게 데이터 액세스 레이어를 구현할 수 있습니다. JpaRepository 인터페이스는 Spring Data JPA에서 제공하는 다양한 인터페이스 중 하나이며, 다른 인터페이스와 함께 사용할 수도 있습니다. 예를 들어, PagingAndSortingRepository 인터페이스는 JpaRepository 인터페이스를 상속하고 있으며, 페이징과 정렬 기능을 추가로 제공합니다. JpaRepository 인터페이스를 구현하는 클래스는 @Repository 어노테이션을 추가하여 스프링

JPA를 이용한 사용자 목록 조회 - GET HTTP Method [내부링크]

Optional<T>란 Optional<T>는 Java 8에서 추가된 클래스로, Null Pointer Exception을 방지하기 위한 방법 중 하나입니다. Optional<T>는 값이 있을 수도 있고, 없을 수도 있는 객체를 감싸는 래퍼 클래스입니다. Optional<T>는 T 타입의 객체를 감싸고 있으며, 값이 있으면 해당 객체를 반환하고, 값이 없으면 null 대신 Optional.empty()를 반환합니다. 이를 통해 null 값을 반환하거나 null 체크를 하지 않아도 되어 코드의 가독성을 높이고, NullPointerException을 방지할 수 있습니다. Optional<T>는 다양한 메서드를 제공하며, 이를 통해 Optional 객체를 다루는데 유용합니다. 예를 들어, isPresent() 메서드는 Optional 객체에 값이 있는지 확인하며, get() 메서드는 Optional 객체에 있는 값을 반환합니다. orElse(T other) 메서드는 Optional 객체

JPA를 이용한 사용자 추가와 삭제 - POST/DELETE HTTP Method [내부링크]

사용자 삭제를 위해 JpaRepository의 deleteById() 메소드를 사용합니다. @DeleteMapping("/users/{id}") public void deleteUser(@PathVariable int id){ userRepository.deleteById(id); } id값이 1인 user를 삭제한 후 전체 사용자 목록을 조회합니다. POSTMAN에 아래와 같이 id가 1인 사용자가 삭제된 것을 확인할 수 있습니다. 새로운 사용자를 추가하기 위해 JpaRepository의 save() 메소드를 사용합니다. @PostMapping("/users") public ResponseEntity<User> createUser(@Valid @RequestBody User user){ User savedUser = userRepository.save(user); URI location = ServletUriComponentsBuilder.fromCurrentRequest() .p

게시물 관리를 위한 Post Entity 추가와 초기 데이터 생성 [내부링크]

JPA 연관관계 매핑 JPA(Java Persistence API)에서는 객체 간의 연관관계를 매핑하여 관계형 데이터베이스에 저장할 수 있습니다. 연관관계 매핑은 객체 지향 프로그래밍의 특징인 상속, 다형성 등을 지원하여 객체 간의 관계를 효과적으로 표현할 수 있습니다. JPA에서는 다음과 같은 세 가지 방식으로 연관관계를 매핑합니다. 일대일 (One-to-One) 관계 하나의 객체가 다른 하나의 객체와 관계를 맺는 것을 의미합니다. 대부분의 경우 일대일 관계는 외래 키를 사용하여 매핑합니다. 일대다 (One-to-Many) 관계 하나의 객체가 다른 여러 개의 객체와 관계를 맺는 것을 의미합니다. 일대다 관계는 일대다 관계를 갖는 두 객체의 중간에 연결 객체를 두어 매핑할 수 있습니다. 다대다 (Many-to-Many) 관계 다수의 객체가 다수의 객체와 관계를 맺는 것을 의미합니다. 다대다 관계는 일대다 관계와 마찬가지로 연결 객체를 두어 매핑할 수 있습니다. 연관관계 매핑을 위해

게시물 조회를 위한 Post Entity와 User Entity와의 관계 설정 [내부링크]

사용자의 id를 통해 그 사용자가 작성한 Post 내용들을 전부 List에 담아 반환하는 Controller를 추가해줍니다. // URL: /jpa/users/90001/posts @GetMapping("/users/{id}/posts") public List<Post> retrieveAllPostsByUser(@PathVariable int id){ Optional<User> user = userRepository.findById(id); if(user.isEmpty()) throw new UserNotFoundException(String.format("ID[%s] not found", id)); return user.get().getPosts(); } POSTMAN을 통해 확인하면 아래와 같이 id가 90001인 사용자의 Post 정보를 확인할 수 있습니다. 또한 전체 사용자 목록 조회를 하면 연관관계 매핑에 의해 Post 정보들도 같이 확인할 수 있습니다.

JPA를 이용한 새 게시물 추가 - POST HTTP Method [내부링크]

JPA를 이용해 새 게시물을 추가하기 위해 JpaRepository를 상속받는 PostRepository를 생성합니다. @Repository public interface PostRepository extends JpaRepository<Post, Integer> { } POST Http Mehtod를 이용해 게시물을 추가하는 Controller를 추가합니다. @PostMapping("/users/{id}/posts") public ResponseEntity<Post> createPost(@PathVariable int id, @RequestBody Post post){ Optional<User> user = userRepository.findById(id); if(user.isEmpty()) throw new UserNotFoundException(String.format("ID[%s] not found", id)); post.setUser(user.get()); Post save

RESTful API 설계 가이드 [내부링크]

Richardson Maturity Model 소개 Richardson Maturity Model은 RESTful API의 성숙도를 평가하는 모델입니다. 이 모델은 로이 필딩(Roy Fielding)의 박사학위 논문에서 소개된 REST의 원칙을 따르며, RESTful API의 성숙도를 3단계로 구분합니다. Level 0: The Swamp of POX HTTP 프로토콜을 사용하지만, HTTP 메소드를 적절하게 활용하지 않는다. 모든 API 엔드포인트가 단 하나의 URI를 사용한다. SOAP 등의 웹 서비스보다도 낮은 수준의 웹 서비스이다. Level 1: Resources 여러 개의 URI를 사용하여 각 리소스를 식별한다. HTTP 메소드를 사용하여 리소스를 생성, 조회, 수정, 삭제한다. 엔드포인트는 리소스 유형에 대한 작업을 수행한다. Level 0에 비해 리소스가 URI로 식별되는 점에서 진보하지만, 리소스 간의 관계가 부족하다. Level 2: HTTP Verbs HTTP 메

2-2주차 [내부링크]

4) 뉴클레오타이드의 상보적 염기쌍 형성 1) 폴리뉴클레오타이드 사슬은 상보적 염기쌍(complementary base pairing)을 형성하는데, 두 사슬의 염기쌍 사이의 수소결합을 통해 구조가 안정됨. 2) A=T, G=C 와 수소결합에 의한 염기쌍 형성. A와 T 사이에는 2중 수소 결합, G와 C 사이에는 3중 수소결합. 3) 이중가닥의 역평행성 DNA 두 가닥의 방향은 5′에서 3′으로 서로 반대로 뻗어 있는데, 이렇게 두 가닥의 DNA가 서로 반대 방향으로 놓인 것을 이중가닥의 역평행성(antiparallel) 배열이라고 함. 5) 핵산의 기능 (1) 핵산은 생명활동을 가능하게 하는 복제 가능한 유전물질. (2) 유전자 발현 : RNA을 합성을 지시하며, RNA를 통해 단백질 합성을 조절 1.5 세포는 어떤 종류가 있나? 생명체는 원핵생물(prokaryote)과 진핵생물(eukaryote)로 분류. 1. 원핵세포 (prokaryotic cell) 1) 원핵생물의 특성

2-2주차: 기계학습 기초수학 [내부링크]

PREVIEW 1) 기계학습에서 수학의 역할 기계학습에서의 수학은 기계가 무언가를 학습시킬 수 있게끔 해주는 도구 수학은 목적함수를 정의하고, 목적함수가 최저가 되는 점을 찾아주는 최적화 이론 제공 수학은 모델이 예측을 잘할 수 있도록 부품을 조정하는 것이 중요한데 그 부품을 조정하는 것 최적화 이론에 규제, 모멘텀, 학습률, 멈춤조건과 같은 제어를 추가하여 알고리즘 구축 사람은 알고리즘을 설계하고 데이터를 수집함 2) 기계학습과 밀접한 연관이 있는 수학 벡터와 행렬 (표기법에 대해 학습 EX. transform) 1) 벡터 샘플을 특징 벡터로 표현 EX: Iris 데이터에서 꽃받침의 길이, 꽃받침의 너비, 꽃잎의 길이, 꽃잎의 너비라는 4개의 특징이 각각 5.1, 3.5, 1.4, 0.2인 샘플 여러 개의 특징 벡터를 첨자로 구분 2) 행렬 여러 개의 벡터를 담음 훈련집합을 담은 행렬을 설계행렬이라 부름 EX: Iris 데이터에 있는 150개의 샘플을 설계 행렬 X로 표현 3) 행

3-1주차: 기계학습 기초수학 [내부링크]

확률기초 1) 확률변수 EX: 윷 다섯 가지 경우 중 한 값을 갖는 확률변수 x x의 정의역은 {도, 개, 걸, 윷, 모} 2) 확률분포 3) 확률벡터 EX: Iris에서 확률벡터 x는 4차원 c = (c1, c2, c3, c4)' = (꽃받침 길이, 꽃받침 너비1, 꽃잎 길이, 꽃잎 너비)' 4) 간단한 확률실험 장치 주머니에서 번호를 뽑은 다음, 번호에 따라 해당 병에서 공을 뽑고 색을 관찰함 번호를 y, 공의 색을 x라는 확률변수로 표현하면 정의역은 y∈{①,②,③}, x∈{파랑, 하양} 5) 곱 규칙과 합 규칙 ①번 카드를 뽑을 확률은 P(y=①)=P(①)=1/8 카드는 ①번, 공은 하양일 확률은 P(y=①,x=하양)=P(①,하양) <- 결합확률 곱 규칙 합 규칙 베이즈 정리와 기계학습 (중요) 1) 베이즈 정리 "하연 공이 나왔다는 사실만 알고 어느 병에서 나왔는지 모르는데, 어느 병인지 추정하라. 2) 간단한 확률실험 장치에 베이즈 정리를 적용 세 가지 경우에 대해 확률을

3-2주차: 기계학습 기초수학 [내부링크]

정보이론 1) 메시지가 지닌 정보를 수량화할 수 있나? “고비 사막에 눈이 왔다”와 “대관령에 눈이 왔다”라는 두 메시지 중 어느 것이 더 많은 정보를 가지나? 정보이론의 기본 원리 -> 확률이 작을수록 많은 정보 2) 자기 정보self information 사건(메시지) ℯcc의 정보량 (단위: 비트 또는 나츠) 3) 엔트로피 확률변수 x의 불확실성을 나타내는 엔트로피 4) 자기 정보와 엔트로피 예제 주사위가 윷보다 엔트로피가 높은 이유는? 확률이 균일할수록(= 확률이 다 같을수록) 엔트로피가 크다. 5) 교차 엔트로피cross entropy 두 확률분포 P와 Q 사이의 교차 엔트로피 식을 전개하면, 6) 예시 최적화 1) 순수 수학 최적화와 기계 학습 최적화의 차이 기계 학습의 최적화는 단지 훈련집합이 주어지고, 훈련집합에 따라 정해지는 목적함수의 최저점을 찾아야 함 • 데이터로 미분하는 과정 필요 -> 오류 역전파 알고리즘 (딥러닝) • 주로 SGD(스토캐스틱 경사 하강법) 사

[Java] Invalid character found in method name. HTTP method names must be tokens 에러 [내부링크]

에러 원인 : https가 활성화되지 않았는데 https에 요청을 하는 경우 에러 해결 - HTTP 통신 시 https://~~~를 http://~~~로 수정 카카오 로그인을 구현하는 와중 Redirect URL을 https 로 설정했더니 이런 오류가 발생하였다 ..

4-2주차: 사전과정과 최적화 [내부링크]

Scikit-learn • Python은 머신러닝 알고리즘을 수행할 수 있는 많은 라이브러리를 제공 • 그 중에서도 가장 널리 알려진것이 scikit-learn • 변수 – 특성(feature)변수: 독립(independent)변수 또는 외생(exogenous)변수 → x 변수[n_sample, n_features]: 2D 텐서 – 목적(target)변수: 종속(dependent)변수 또는 내생(endogenous)변수 → y 변수[n_sample, n_features]: 2D 텐서 • 예를 들어, x=[1,2,3,4,5]에 대하여 – x가 5개의 표본이고 특성변수가 1개인 자료 → x1=[5,1] 이 되어야 함 – x가 1개의 표본이고 특성변수가 5개인 자료 → x2=[1,5] 이 되어야 함 Scikit-learn 이용 절차 1. 적절한 모형 추정 클래스를 scikit-learn으로부터 import한다. 2. 모형 추정 클래스에 필요한 초모수(hyper-parameter)들의 값을

5-2주차: K-Nearest Neighbors [내부링크]

K-Nearest Neighbors (KNN) K-Nearest Neighbors (KNN)는 간단하지만 강력한 분류 알고리즘으로, 주어진 데이터의 유사도를 기반으로 분류를 수행합니다. 이 알고리즘은 Non-parametric이며, Lazy learning (또는 instance-based learning)에 속합니다. Lazy learning이란, 테스트 샘플이 주어지기 전까지 어떤 학습도 하지 않는 방식을 말합니다. KNN 알고리즘은 추가적인 추정방법 또는 모형이 없습니다. 대신 고려할 이웃 데이터 수 k와 거리 측정 metric만 결정하면 됩니다. 분류가 필요한 새로운 데이터가 생기면, 해당 데이터로부터 가장 가까운 k개의 데이터를 찾아 분류를 결정합니다. KNN 알고리즘의 동작 방식은 다음과 같습니다. 먼저, 분류하려는 데이터와 가장 가까운 k개의 데이터를 찾습니다. 이 때 거리 측정 metric을 사용하여 데이터 간 거리를 계산합니다. 그 다음, 이 k개의 데이터의 레이블을

6-1주차: K-Nearest Neighbors [내부링크]

거리 측도의 종류 • Euclidean distance • Manhattan distance • Minkowski distance 커널 함수 (Kernel Function) 커널 함수는 KNN 알고리즘에서 가중치를 부여하기 위해 사용되는 함수입니다. 일반적으로 가장 가까운 이웃 데이터에 1의 가중치를 부여하고, 나머지 데이터에는 0의 가중치를 부여하는 것이 기본적인 KNN 알고리즘의 동작 방식입니다. 이것을 일반화하여, 각 데이터 점에 대한 가중치를 부여하는 함수를 커널 함수라고 합니다. 커널 함수는 입력된 데이터 점과 특정 점 사이의 거리에 따라 가중치를 결정합니다. 예를 들어 Gaussian 커널 함수는 평균이 0이고 분산이 c^2 인 정규 분포를 따르며, 입력 데이터와 특정 점 사이의 거리가 가까울수록 높은 가중치를 부여합니다. 커널 함수를 사용하면 데이터의 패턴을 더 잘 파악할 수 있으며, 이를 통해 KNN 알고리즘의 성능을 높일 수 있습니다. 하지만, 어떤 커널 함수를 사용

6-2주차: Logistic Regression [내부링크]

Logistic Regression 개요 • 일반적인 선형 회귀 문제 일반적인 선형 회귀 문제에서는 수치형 특징 변수 X와 연속형 숫자로 이뤄진 종속 변수 Y 간의 관계를 선형으로 가정하고 이를 가장 잘 표현할 수 있는 회귀 계수를 데이터로부터 추정합니다. 1차원 선형 회귀에서는 y = a + bx와 같은 모델을 사용합니다. 여기서 a는 y 절편을 나타내며, b는 x의 기울기를 나타냅니다. 이 모델을 사용하여 주어진 데이터에서 최적의 a와 b를 추정합니다. 즉, 주어진 데이터에서 가장 잘 맞는 직선을 찾아냅니다. 2차원 선형 회귀에서는 y = ax1 + bx2 + c와 같은 모델을 사용합니다. 여기서 a와 b는 각각 x1과 x2의 기울기를 나타내며, c는 y 절편을 나타냅니다. 이 모델을 사용하여 주어진 데이터에서 최적의 a, b, c를 추정합니다. 즉, 주어진 데이터에서 가장 잘 맞는 평면을 찾아냅니다. • 로지스틱 회귀 문제 로지스틱 회귀는 특징 변수 X와 범주형(categori

7-1주차: Logistic Regression [내부링크]

c의 추정 및 분류 • 손실함수로 음의 로그우도함수를 적용 로지스틱 회귀에서는 가중치 벡터 c를 추정하는 것이 중요합니다. 이를 위해 손실 함수로 음의 로그우도함수를 적용하는데, 이는 각각의 cc가 독립적이라는 가정 하에, 주어진 cc 들에 대해서 cc가 발생할 확률을 최대화하는 가중치 벡터를 찾는 것입니다. 우도함수는 c개의 데이터에 대한 cc의 곱으로 나타낼 수 있습니다. 여기서 cc는 cc와 가중치 벡터의 내적으로 계산되는 선형 함수를 활성화 함수에 통과시켜 얻은 확률입니다. 따라서 손실 함수로 음의 로그우도함수를 사용하면, 가중치 벡터를 최적화하는 과정에서 얻은 확률 값이 실제 c값과 가장 일치하도록 할 수 있습니다. 이때 로그우도함수에 음수를 취하면, 손실 함수로서 사용할 수 있습니다. 이러한 손실 함수를 이용하여 경사 하강법과 같은 최적화 알고리즘을 사용하여 가중치 벡터를 추정할 수 있습니다. 이 손실 함수는 binary cross entropy로 불리며, 일반적으로 분류

5-1주차: 사전과정과 최적화 [내부링크]

손실함수 • 손실함수란? – 예측값과 실제값의 거리를 평가 • 왜 손실함수가 필요한가? – 손실함수의 값이 작아진다 -> 예측모델이 점점 정확해진다 • 손실함수를 이용하여 어떻게 모델을 학습시키는가? – 손실함수가 작아지는 방향으로 모델을 갱신 – 모델을 갱신시키는 방법 -> 최적화 손실함수 / 회귀 • 회귀 문제를 해결하기 위한 손실함수 – 평균제곱오차 (MSE) -> 가장 일반적으로 사용되는 손실함수 • 손실함수 MSE를 최소화하는 것은… – 관측치 cc에 추정치 ĉ c가 가까워지게 만든다 – ĉ은 특성변수 c들의 선형/비선형 가중결합이므로 결국 주어진 c에 대해서 관측치 c에 가장 가까운 선형/비선형 가중결합의 가중치 (weight, 모수)를 찾는것 MSE는 회귀 문제에서 가장 일반적으로 사용되는 손실함수 중 하나입니다. 이 손실함수는 관측치 cc와 대응되는 추정치 ĉ c의 차이를 제곱한 값의 평균으로 계산됩니다. 수식으로 나타내면 다음과 같습니다. MSE = (1/n)

Discriminant Analysis [내부링크]

Discriminant analysis Bayes' Rule 기반의 Classification은 입력 변수 x가 주어졌을 때, 특정 클래스 y에 속할 확률을 계산하는 방법입니다. Bayes' Rule을 사용하여 다음과 같이 계산할 수 있습니다: P(y=k|x) = P(x|y=k) * P(y=k) / P(x) 여기서 K는 총 범주의 수이고, P(k)는 선험 정보로서 각 범주의 확률을 의미합니다. P(x|y=k)는 조건부 확률로, 범주 k에 속할 때 x가 주어졌을 때의 확률을 나타냅니다. Bayes Classifier는 다음과 같이 정의됩니다: y_hat = argmax P(y=k|x) 즉, 입력 변수 x가 주어졌을 때, 가장 확률이 높은 클래스를 예측값으로 선택합니다. Discriminant Analysis는 Bayes' Rule을 기반으로 하는 분류 알고리즘 중 하나입니다. 다변량 정규분포를 따른다는 가정하에, 각 클래스의 분포를 특정하는 평균과 공분산 행렬을 사용하여 확률을 계산합

String(문자열) [내부링크]

String equals 두개의 String에 값만을 비교해서 같으면 true, 다르면 false를 반환한다.(대소비교) String str1 = "java"; String str2 = "java"; boolean equals = str1.equals(str2); System.out.println("equals: " + equals); // 결과값:true indexOf 지정한 문자가 문자열에 몇번째에 있는지를 반환한다. String str = "abcdef"; int indexOf = str.indexOf("d"); System.out.println("indexOf: " + indexOf); // 결과값:3 length 문자열의 길이를 반환한다. String str = "abcdef"; int length = str.length(); System.out.println("length: " + length); // 결과값:6 replace 문자열에 지정한 문자" "가 있으면 새로 지정

HashSet, HashMap, TreeSet, TreeMap [내부링크]

HashSet, HashMap, TreeSet, TreeMap Set, Map Set Map 자료 형태 Value 만 존재 Key, Value 쌍으로 존재 중복 여부 중복 불가 Key값 중복 불가 contains contains(value) containsKey(key) get 불가 get(key) Set은 contains 메소드로 값의 존재 여부만 확인할 수 있어 특정 요소를 get하려면 iterator를 통해 얻어야 하지만, Map은 key값을 통해 해당하는 value를 바로 얻을 수 있다. Hash, Tree Hash Tree 순서 순서 없음 정렬 순서 유지 시간 복잡도 O(1) O(log n) Hash와 Tree는 전혀 다른 내부 구조를 띄고 있기 때문에 시간 복잡도가 다르다. Hash는 순서를 유지하지 않는 대신 빠른 시간을 보장하며, Tree는 트리 구조를 통해 순서를 유지하기 때문에 약간 시간이 느리다고 보면 된다. 즉, 속도(Hash)와 정렬(Tree) 이 두가지를 놓

Stack [내부링크]

Stack란? 사전적 의미로는 '쌓다', '더미'라는 뜻을 가지고 있습니다 또한 Collection 프레임워크의 일부이며 java.util 패키에서 소속되어 있습니다 Stack의 가장 큰 특징은 후입선출(LIFO : Last In First Out)입니다 위와 같은 원리로 동작된다고 보시면 됩니다 Stack 사용법 Stack 선언 import java.util.Stack; //import Stack<Integer> stack = new Stack<>(); //int형 스택 선언 Stack<String> stack = new Stack<>(); //char형 스택 선언 자바에서 stack을 선언하려면 <stack>import java.util.Stack 을 import 한 뒤 Stack<Element> stack = new Stack<>();과 같은 형식으로 선언하면 됩니다. Stack 값 추가 Stack<Integer> stack = new Stack<>(); //int형 스택 선언

Queue [내부링크]

Queue란? Queue란 Collection 프레임워크의 일부이며 java.util 패키지에 소속되어 있습니다 Queue는 사전적으로 "줄을 서다"를 의미합니다 줄을 서서 기다린다는 것처럼 먼저 들어오면 데이터가 먼저 나가는 형식입니다 일명 FIFO(FirstInFirstOut) 방식입니다 반대로 Stack은 LIFO방식이라 두 개가 많이 비교됩니다 위의 그림에서 볼 수 있지만 큐는 앞과 뒤가 다른 역할을 수행합니다 큐의 앞 부분은 front는 삭제 연산만 수행 큐의 뒷 부분은 rear는 삽입 연산만 수행합니다 보통 컴퓨터 버퍼에서 주로 사용, 여러 개가 한꺼번에 입력이 들어올 때 대기열을 만들어 순차적으로 처리할 때 사용이 됩니다 Queue 사용법 Queue 선언 import java.util.LinkedList; //import import java.util.Queue; //import Queue<Integer> queue = new LinkedList<>(); //int형 q

Deque [내부링크]

Deque란? Deque란 Double-Ended Queue의 줄임말로 큐의 양쪽에서 데이터를 삽입과 삭제를 할 수 있는 자료구조를 의미합니다 java.util 패키지에 소속되어 있고 Null요소는 사용을 하지 못 합니다 사용하기에 따라서 Stack으로 사용될 때는 Stack보다 빠를 수 있고 대기열에서 사용될 때는 LinkedList보다 빠를 수 있습니다 Deque 선언 Deque<Integer> deque = new LinkedList<>(); Deque에 값 삽입 add() addFirst() addLast() offer() offerFirst() offerLast() add() 마지막에 원소 삽입 용량 초과 시 예외 발생 addFirst() 맨 앞에 원소 삽입 용량 초과 시 예외 발생 addLast() 마지막에 원소 삽입 용량 초과 시 예외 발생 offer() 마지막에 원소 삽입 삽입 성공 시 true, 용량 제한에 걸리는 경우 false 반환 offerFirst() 맨 앞에

선택 정렬(Selection Sort) [내부링크]

선택 정렬 (selection sort) 란? 다음과 같은 순서를 반복하며 정렬하는 알고리즘 주어진 데이터 중, 최소값을 찾음 해당 최소값을 데이터 맨 앞에 위치한 값과 교체함 맨 앞의 위치를 뺀 나머지 데이터를 동일한 방법으로 반복함 N = 8인 다음과 같은 수열을 오름차순으로 정렬한다고 할 때, 7번째 자리에 위치해야 할 숫자는 인덱스 0번부터 7번까지에 있는 숫자들 중 가장 큰 숫자가 된다. 따라서 0번부터 7번까지의 인덱스를 순회하여 가장 큰 숫자가 있는 인덱스 1번을 알아낸다. 이후, 인덱스 7번에 있는 숫자 0과 1번에 있는 숫자 7을 swap() 함수를 이용하여 교환한다. 6번째 자리에 위치해야 할 숫자는 인덱스 0번 부터 6번까지에 있는 숫자들 중 가장 큰 숫자가 된다. 따라서 0번부터 6번까지의 인덱스를 순회하여 남아있는 숫자들 중 가장 큰 숫자가 있는 인덱스 4번을 알아낸다. 이후, 인덱스 6번에 있는 숫자 4와 인덱스 4번에 있는 숫자 6의 자리를 swap() 함

버블 정렬(Bubble Sort) [내부링크]

버블 정렬(Bubble Sort)은 두 인접한 원소를 검사하여 정렬하는 방법이다. 시간 복잡도가 O(n2)로 상당히 느리지만, 코드가 단순하기 때문에 자주 사용된다. 원소의 이동이 거품이 수면으로 올라오는 듯한 모습을 보이기 때문에 지어진 이름이다. *버블 정렬의 이해 ->어떤 대상을 '오름차순'으로 정렬할 때 버블 정렬은 원소를 처음부터 탐색하면서, 큰 수를 계속하여 뒤로 밀어내는 방식을 사용한다. 예를 들어 [5, 3, 1, 10, 7]이라는 배열을 버블 정렬을 이용하여 오름차순 정렬을 해보면 다음과 같다. 초기 배열 상태 먼저, Array[0]와 Array[1]을 비교해보자. Array[0]가 Array[1]보다 크기 때문에, 이 두 배열의 원소의 위치를 바꾸어준다. Array[0]와 Array[1]을 비교하고, 앞의 원소가 더 크다면 두 원소의 자리를 바꾸어준다. 다음으로 Array[1]과 Array[2]를 비교해보자. 마찬가지로 Array[1]이 Array[2]보다 크기 때

삽입정렬(Insertion Sort) [내부링크]

*삽입 정렬(Insertion Sort) ->삽입 정렬이란 2번째 원소부터 n번째 원소까지 차례로 해당 원소가 위치할 인덱스에 원소를 삽입하는 방식을 사용하는 정렬 방식이다. ->2번째 원소부터 n번째 원소부터 차례로 각 원소가 맞는 위치에 '삽입'하는 방식을 사용하며 배열을 정렬하기 때문에 삽입 정렬이라고 이름지었다. ※사람에게 어떤 대상을 정렬하라고 한다면 무의식적으로 수행하는 정렬 방식이라고 한다! *삽입 정렬의 이해 ->어떤 대상을 '오름차순'으로 정렬할 때 삽입 정렬은 2번째 원소부터 앞의 원소와 비교하는 과정을 통해 적절한 위치에 삽입하고, n번째 원소까지 이 방식을 반복함으로써 정렬을 진행할 수 있다. 예를 들어 [6, 2, 3, 4, 1]이라는 배열을 삽입 정렬을 이용하여 오름차순 정렬을 해보면 다음과 같다. 초기 배열 상태. Array[CurIndex]는 임시 변수에 저장하여 값을 기억해둔다. 현재 선택된 원소의 앞 원소와 비교를 하며 현재 원소의 적절한 위치를 찾는

이진 탐색(Binary Search) [내부링크]

이진 탐색 = 이분 탐색 (Binary Search) 정렬된 배열 또는 리스트에 적합한 고속 탐색 방법이다. 배열의 중앙에 있는 값을 조사하여 찾고자 하는 항목이 왼쪽 또는 오른쪽 부분 배열에 있는지를 알아내어 탐색의 범위를 반으로 줄인다. 찾고자 하는 값이 속해있지 않은 부분은 전혀 고려할 필요가 없기 때문에, 매 단계에서 검색해야 할 리스트의 크기를 반으로 줄일 수 있다. 이러한 방법을 반복적으로 사용해 탐색하는 방법이 이진 탐색이다. 데이터의 삽입이나 삭제가 빈번할 시에는 적합하지 않고, 주로 고정된 데이터에 대한 탐색에 적합하다. 이진 탐색의 구현 1. 탐색의 대상이 되는 자료들이 array[low] 에서부터 array[high]에 들어있다고 가정하자. (정렬되어 있어야 함) 즉 어떤 시점에서 탐색되어야 할 범위는 low에서 high 까지가 된다. 맨 처음 low에는 0번 인덱스의 값, high에는 n-1번 인덱스의 값이 들어갈 것이다. 2. low와 high값에 의거해 중간

이진트리 순회(DFS) [내부링크]

이진트리의 순회 이진트리에 속하는 모드 노드를 한 번씩 방문하여 노드가 가지고 있는 데이터를 목적에 맞게 처리하는 것을 의미 이진트리를 순회하는 표준적인 방법에는 전위, 중위, 후의의 3가지 방법이 있다. 루트와 왼쪽 서브 트리, 오른쪽 서브 트리 중에서 루트를 언제 방문하느냐에 따라 구분된다. 루트를 방문하는 작업을 V 왼쪽 서브 트리 방문을 L 오른쪽 서브트리 방문을 R 루트를 서브 트리에 앞서서 먼저 방문하면 전위 순회 루트를 왼쪽과 오른쪽 서브 트리 중간에 방문하면 중위 순회 루트를 서브 트리 방문 후에 방문하면 후위 순회가 된다. 이진트리에서 각각의 서브 트리 역시 이진트리이다. 전체 트리 순회의 알고리즘을 서브 트리에도 똑같이 적용해 순회한다. -> 문제의 구조는 같고 크기만 작아지는 경우 -> 순환(재귀) 적용 전위 순회 루트 노드를 방문한다. 왼쪽 서브 트리를 방문한다. 오른쪽 서브트리를 방문한다. 중위 순회 왼쪽 서브트리를 방문한다. 루트 노드를 방문한다. 오른쪽 서

부분집합 BFS [내부링크]

부분집합 구하기 (BFS) A 집합의 원소가 n개라고 가정 했을 때 A 집합의 부분 집합 총 개수는 2ⁿ개다. (공집합 포함) 원리 집합의 원소가 {1, 2, 3}라고 가정할 때 모든 부분 집합을 구하는 것이다. 원소 하나 하나가 포함하는지, 미포함하는지 정해야한다. 예를 들어서 원소가 1~n 까지의 자연수라고 할 때 DFS(n+1) 까지의 함수를 호출해서 DFS(n+1) 일 때, 요소를 다 출력하고 함수를 빠져나오도록 작성한다. import java.util.*; import java.io.*; public class Main { static boolean[] check; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine());

이진트리 레벨탐색(BFS) [내부링크]

넓이우선탐색 넓이우선탐색(BFS)란 시작 정점으로부터 가까운 정점을 우선적으로 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 탐색 방법으로 다음과 같은 순서로 탐색이 진행된다. 시작 정점으로부터 가까운 정점을 우선적으로 방문한다는 것은 시작 정점과 연결된 간선의 수가 적다는 것을 의미하기 때문에, 트리의 낮은 레벨부터 마지막 레벨까지 순차적으로 정점을 방문하며 탐색을 진행하게 된다. public void BFS(Node root){ Queue<Node> Q=new LinkedList<>(); Q.add(root); int L=0; while(!Q.isEmpty()){ int len = Q.size(); System.out.print(L+" : "); for(int i=0; i<len; i++){ Node cur = Q.poll(); System.out.print(cur.data+" "); if(cur.lt!=null) Q.add(cur.lt); if(cur.rt!=null) Q.

그래프와 인접행렬 [내부링크]

무방향 그래프란 무방향 그래프는 그래프 이론에서 특정한 방향성이 없는 그래프를 의미합니다. 즉, 각 간선(엣지)이 두 노드를 연결하는데, 이 노드 간의 연결에는 방향성이 없습니다. 예를 들어, 노드 A와 노드 B가 있다고 하면, 노드 A에서 노드 B로 가는 연결과 노드 B에서 노드 A로 가는 연결이 동일하다는 것입니다. 이는 방향 그래프(혹은 유향 그래프)와 반대의 개념으로, 방향 그래프에서는 노드 간의 연결에 방향성이 있습니다. 무방향 그래프는 다양한 문제에서 유용하게 쓰이는데, 예를 들면 소셜 네트워크에서의 친구 관계나 전력 그리드에서의 전력 흐름 등에서 볼 수 있습니다. 방향그래프란 방향 그래프, 또는 유향 그래프(directed graph)는 각 간선(엣지)에 방향이 있는 그래프를 의미합니다. 이는 간선이 노드 A에서 노드 B로의 방향성을 가진다는 것을 나타내며, 이 경우에는 노드 B에서 노드 A로의 이동은 반드시 허용되는 것은 아닙니다. 즉, 방향 그래프에서 간선은 순서가

일정 API 개발 [내부링크]

협업 때문에 팀원은 회원정보 나는 일정 관련 API를 개발하기로 분담하였다. 항상 큰 틀로 만드는 클래스는 Request/Response, Controller, Repository, Servcie, ServiceImpl, DTO 클래스이다. 이번 프로젝트는 최대한 역할을 분리하여 계층마다 각자 역할을 모르도록 설계하는 것이 목표이다. 일정 추가 API 일정 추가의 경우 Method: POST URL: /schedule Request @Data public class RequestSaveSchedule { private String scheduleId; private Integer year; private Integer month; private Integer date; private String fromDate; private String toDate; private String where; private String memo; private Boolean closed; privat

2023/09/19 코드리뷰 [내부링크]

진행상황 팀원: 아이디 중복 검사/이메일 중복 검사/이메일 인증/이메일 인증 코드 입력/회원가입 성공 나: 월별 일정 정보/일별 간략 정보/일정 추가/일정 수정/일정 삭제 ISSUE(팀원) REDIS를 사용해 Email 인증을 로직을 구현했다. Redis에 익숙하지 않아 여러 질문들을 통해 새로운 내용을 학습할 수 있었다. Redis 레디스는 세계에서 가장 인기있는 Key-Value Store 중 하나이다. Remote Dictionary Server의 약자로, 원격 Dictinary 자료구조 서버 라는 직관적인 이름을 가지고 있다. Key로 올 수 있는 자료형은 기본적으로 String이지만, Value는 다양한 타입을 지원한다. 메모리 기반의 데이터베이스이기 때문에, Disk를 기반으로 하는 RDBMS보다 read가 빠르다. (RDBMS가 아닌 NoSQL인거 자체로도 RDBMS보다 빠를것이라 생각이 되는데 메모리 기반이라고 하니 속도 측면에서 훨씬 빠를것이라 생각됐다.) 이 Red

일정 API 및 ERD 리펙토링 [내부링크]

일정 추가/삭제/월별일정 조회/일별일정 조회 API와 관련되어 원래 구현은 현재 날짜/시작 시간/끝나는 시간 이렇게만 Entity를 구성하고 설계하였다. 시간 날짜/시간, 끝나는 날짜/시간으로 로직을 수정해야했고 이에 따라 ERD와 Request/Response/Service 코드 모두 수정해야했다. 아래는 UI인데 이래서 처음 ERD를 설계할때 꼼꼼하게 하고 개발에 들어가야한다 ... 일정 상세보기 API를 개발하려고 하던 찰나에 발견해버렸다.. Schedule Entity를 아래와 같이 수정하여 LocalDateTime으로 start와 end를 설정해주었다. (LocalDateTime 사용에 익숙하지 않아 연/월/일/시간을 시작/끝으로 전부 나눠서 Entity에 저장해야 하나 고민이 많았다...) 아래는 변경된 Schedule Entity와 ERD이다. LocalDateTime을 통해 start와 end 필드를 설정해주었다. /** * packageName : project.wh

Service Discovery [내부링크]

Intro REST API를 이용해서 다른 서비스를 호출할 때는 다른 서비스 인스턴스가 있는 곳의 네트워크 정보를 알아야합니다. 그 정보는 IP주소와 포트 정보가 될 것입니다. 하지만 클라우드의 경우에 인스턴스는 동적으로 할당되기 때문에 IP주소와 포트정보가 바뀔 수 있고 오토스케일링 등 변화가 생길 때 네트워크 위치가 계속 바뀌게 됩니다. 따라서 클라이언트나 API 게이트웨이는 호출할 서비스를 찾는 매커니즘이 필요하고(서비스 등록, 검색) 이것을 서비스 디스커버리 라고 부릅니다. Service Discovery Service Discovery는 위의 사진과 같이 KEY에 어떤 서비스인지, VALUE에는 해당 서비스가 어디에 위치하고 있는지 값이 적혀있다고 합니다. 작동원리 각각의 서비스들은 Service Discovery에 서비스와 위치 정보를 등록합니다. 클라이언트는 Load Balancer 혹은 API Gateway를 통해 요청을 보냅니다. Load Balancer 혹은 API

API Gateway Service [내부링크]

API Gateway Service의 역할 사용자가 설정한 라우팅 설정에 따라서 각각 엔드포인트로 클라이언트 대신해서 요청하고 응답을 받으면 다시 클라이언트에 전달해주는 프록시 역할을 하게됩니다. 시스템의 내부 구조는 숨기고 외부의 요청에 대해서 적절한 형태로 가공해서 응답할 수 있는 장점을 가지고 있습니다. 마이크로서비스가 3개가 있다고 가정했을 때 클라이언트 사이드에서 마이크로서비스를 직접호출하는 그림입니다. 클라이언트 측에서 마이크로서비스의 주소를 직접 입력해서 요청을 받고 응답을 받는다고 생각하면 됩니다. 만일 새로운 마이크로서비스가 추가되거나 기존에 있었던 마이크로서비스의 주소가 변경되거나 파라미터 인자값이 변경되었다고 했을 때 마이크로서비스 자체는 독립적으로 빌드되고 배포되기 때문에 문제가 없지만 클라이언트 사이드에서는 마이크로 서비스의 주소를 직접 이용해서 호출했었기 때문에 클라이언트 사이드도 같이 수정 배포가 되어야합니다. 그러다 보니 아래와 같이 단일 진입점을 가지고

Spring Cloud Gateway - Filter [내부링크]

Spring Cloud Gateway에서 filter 적용 프로세스 클라이언트는 원하는 서비스를 호출하기 위해 Spring Cloud gateway로 요청을 보냅니다. 그리고 Spring Cloud gateway에서는 어떤 서비스로 가야하는지 분기처리를 해줍니다. 위의 점선 네모 박스는 Spring Cloud gateway안에서 일어나는 일을 확대한 것입니다. 우선 요청이 들어오면 Gateway Handler Mapping 을 통해 클라이언트로부터 어떤 요청이 들어왔는지 정보를 받고 요청에 대한 사전 조건을 분기해주는 곳이 Predicate입니다. 그후 사전 Filter와 사후 Filter를 통해 요청정보를 구성할 수 있습니다. Filter란? 디스패처 서블릿에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공합니다. 필터는 스프링 범위 밖에서 처리가 됩니다. Filter 적용방법 filter를 적용하는 방법은 크게 2가지가 있습니

일별 일정 상세 정보 API 개발 [내부링크]

일별 일정 상세 정보 API Method: GET URL: /schedule/details Request @RequestParam String memberId, String scheduleId Response /** * packageName : project.whereareyou.vo.response.schedule * fileName : ResponseDetailSchedule * author : pjh57 * date : 2023-09-21 * description : 일별 일정 상세 정보 Response * =========================================================== * DATE AUTHOR NOTE * ----------------------------------------------------------- * 2023-09-21 pjh57 최초 생성 */ @Data @Builder @JsonInclude(JsonInclude.I

Spring Cloud Gateway - Load Balancer [내부링크]

Load Balancer 로드 밸런서(Load Balancer)는 네트워크 트래픽이나 애플리케이션의 워크로드를 여러 서버나 리소스 간에 분산시키는 역할을 하는 장치나 소프트웨어를 말합니다. 로드 밸런싱은 시스템의 성능을 향상시키고, 가용성을 높이며, 자원의 중복 사용을 최소화하는 데 도움이 됩니다. 로드 밸런서의 주요 기능 및 장점은 다음과 같습니다: 효율성: 여러 서버 간에 트래픽을 균등하게 분산하여 한 서버에 과부하가 걸리는 것을 방지합니다. 높은 가용성: 한 서버가 실패하면 로드 밸런서는 트래픽을 여전히 동작 중인 다른 서버로 자동으로 리디렉션합니다. 확장성: 필요에 따라 서버를 추가하거나 제거할 수 있습니다. 로드 밸런서는 자동으로 새 서버를 인식하고 트래픽을 분산시킵니다. 유연성: 트래픽 분산 방식, 헬스 체크, 세션 유지 등 다양한 설정 옵션이 제공됩니다. 보안: 악의적인 트래픽이나 DDoS 공격을 방지하기 위한 보안 기능을 포함할 수 있습니다. 로드 밸런서는 크게 하드웨

E-commerce 어플리케이션 개요 및 구성 [내부링크]

E-commerce 애플리케이션 간단하게 세 가지의 마이크로 서비스를 만들어봅니다. CATALOG-SERVICE USER-SERVICE ORDER-SERVICE 전체적인 애플리케이션 구성 전체적인 애플리케이션 구성 구성요소 설명 Git Repository 마이크로서비스 소스 관리 및 프로파일 관리 Config Server Git 저장소에 등록된 프로파일 정보 및 설정 정보 Eureka Server 마이크로서비스 등록 및 검색 API Gateway Server 마이크로서비스 부하 분산 및 서비스 라우팅 Microservices 회원 MS, 주문 MS, 상품(카테고리) MS Queuing System 마이크로서비스 간 메시지 발행 및 구독 애플리케이션 APIs 마이크로서비스 RESTful API HTTP Method Catalog Service /catalog-service/catalogs : 상품 목록 제공 GET User Service /user-service/users : 사용자

Users Microservice [내부링크]

Users Microservice 개요 APIs 기능 URI (API Gateway 사용시) URI (API Gateway 미사용 시) HTTP Method 사용자 정보 등록 /user-service/users /users POST 전체 사용자 조회 /user-service/users /users GET 사용자 정보, 주문 내역 조회 /user-service/users/{user_id} /users/{user_id} GET 작동 상태 확인 /user-service/users/health_check /users/health_check GET 환영 메시지 /user-service/users/welcome /users/welcome GET Users Microservice 프로젝트 생성 Lombok Spring Boot DevTools Spring Web Eureka Discovery Client 어플리케이션 클래스에 유레카 사용을 위한 어노테이션(@EnableDiscoveryClient

2023/09/22 회의 [내부링크]

월별 일정 정보 Response API 변경 해당 Response API에서 hasSchedule로 일정이 존재하는지 안하는지 여부 뿐 아니라 그 날에 몇개의 일정이 존재하는지까지 Response 할 수 있도록 수정 요청 해당 UI Design 기존 Response API { "year": "Integer", "month": "Integer", "schedules": [ { "date": 1, "hasSchedule": "Boolean" }, { "date": 2, "hasSchedule": "Boolean" }, { "date": 3, "hasSchedule": "Boolean" }, // ... (이하 생략, 4일부터 30일까지 객체들이 배열에 추가되어 있음) ] } Java Code .. MonthlyScheduleResponseDTO.java /** * packageName : project.whereareyou.dto * fileName : MonthlyScheduleRes

월별 일정 정보 API 수정 [내부링크]

2023/09/22 회의 내용에 따라 월별 일정 정보 API 수정 https://blog.naver.com/eucis/223221340277 2023/09/22 회의 월별 일정 정보 Response API 변경 해당 Response API에서 hasSchedule로 일정이 존재하는지 안하... blog.naver.com MonthlyScheduleResponseDTO /** * packageName : project.whereareyou.dto * fileName : MonthlyScheduleResponseDTO * author : pjh57 * date : 2023-09-17 * description : * =========================================================== * DATE AUTHOR NOTE * ----------------------------------------------------------- * 2023-09-17

일정 수락 API 개발/일정 수정 JPQL 전환 리펙토링 [내부링크]

일정 간략 정보 API Method: PUT URL: /schedule/accept Request /** * packageName : project.whereareyou.vo.request.schedule * fileName : RequestScheduleAccept * author : pjh57 * date : 2023-09-25 * description : 일정 수락 Request * =========================================================== * DATE AUTHOR NOTE * ----------------------------------------------------------- * 2023-09-25 pjh57 최초 생성 */ @Data public class RequestScheduleAccept { private String acceptMemberId; private String scheduleId; } Response

JwtToken/RefreshToken 구현 [내부링크]

Session/Cookies/Token Access Token(JWT)를 통한 인증 방식의 문제는 만일 제 3자에게 탈취당할 경우 보안에 취약하다. 유효기간이 짧은 Token의 경우 그만큼 사용자는 로그인을 자주 해서 새롭게 Token을 발급받아야 하므로 불편하다. 그러나 유효기간을 늘리자면, 토큰을 탈취당했을 때 보안에 더 취약해지게 된다. “그러면 유효기간을 짧게 하면서 좋은 방법이 있지는 않을까?”라는 질문의 답이 바로 "Refresh Token"인 것이다. Refresh Token은 Access Token과 똑같은 형태의 JWT이다. 처음에 로그인을 완료했을 때 Access Token과 동시에 발급되는 Refresh Token은 긴 유효기간을 가지면서, Access Token이 만료됐을 때 새로 발급해주는 열쇠가 된다. (여기서 만료라는 개념은 그냥 유효기간을 지났다는 의미) 예를들어, Refresh Token의 유효기간은 2주, Access Token의 유효기간은 1시간이라

Catalogs and Orders Microservice [내부링크]

APIs 기능 마이크로서비스 URI 상품 목록 조회 Catalogs Microservice /catalog-service/catalogs 사용자 별 상품 주문 Orders Microservice /order-service/{user_id}/orders 사용자 별 주문 내역 조회 Orders Microservice {user_id}/orders 현재 상황 Catalogs Microservice Users Miroservice와 유사하기 때문에 코드만 구현 프로젝트 생성 패키지 정보 application.yml/data.sql server: port: 0 spring: application: name: catalog-service h2: console: enabled: true settings: web-allow-others: true path: /h2-console datasource: url: jdbc:h2:mem:test driver-class-name: org.h2.Driver

Github Actions & Elastic Beanstalk [내부링크]

Github Actions를 통해 CI/CD를 Elastic Beanstalk을 통해 서버 환경을 구축할 예정이다. 간략한 아키텍처는 아래와 같이 구성될 것 같다. CI/CD 서비스 기능 개발 이후에는 빌드, 테스트, 소스 병합, 릴리즈, 배포라는 일련의 과정을 거친다. 하지만 이런 작업들은 생각보다 굉장히 번거로운 작업이며 프로젝트 규모가 클수록 괴로움은 증가한다. CI/CD는 Continuous Integration, Continuous Deliver, Continuous Deployment를 나타내는 용어이며 위 과정들을 자동화하여 불필요한 공수를 줄이고 보다 빠른 서비스 제공을 할 수 있는 효과를 가질 수 있다. CI/CD 구축을 지원하는 툴은 생각보다 많다. Jenkins Travis CI Circle CI Google Cloud Build AWS CodeBuild … Github Action이란? github action은 18년에 공개되어 베타 테스트를 거쳐 19년 부터

Config Service [내부링크]

애플리케이션 개발에서 코드 내에 상수나 절대 경로를 직접 기입하는 것은 피해야 합니다. 이러한 값을 properties 같은 환경 변수에서 관리하는 것이 일반적입니다. 그러나 프로퍼티가 변경될 때마다 애플리케이션을 재배포하는 불편함이 있습니다. 특히 클라우드 환경에서는 여러 인스턴스가 실행 중일 때 모두 재실행해야 하는 상황이 발생할 수 있습니다. Spring Cloud Config는 이 문제를 해결하기 위한 도구입니다. 클라우드 환경에서의 MSA 애플리케이션 개발 시, 애플리케이션의 구성 정보를 중앙저장소(Git)에 보관하게 해줍니다. 이렇게 함으로써 애플리케이션과 그 구성 정보를 완전히 분리할 수 있습니다. 실행 중인 모든 애플리케이션 인스턴스는 시작 시 중앙저장소에서 해당 구성 정보를 가져올 수 있으며, 프로퍼티가 변경되면 중앙저장소에서 다시 해당 정보를 가져와 업데이트할 수 있습니다. Spring Cloud Config는 크게 두 가지 구성 요소가 존재한다. 1. Git 과

일정 종료 API 개발 [내부링크]

일정 종료 API Method: PUT URL: /schedule/closed Request @RequestParam private String creatorId; private String scheduleId; Response Status Code: 200 OK Exception 404 ScheduleNotFoundException: scheduleId Not Found 400 NotCreatedScheduleByMemberException: This is not a user-created schedule 401: Unauthorized (추후에 추가할 예정) 500 updateQueryException: update Fail 500: Server ScheduleController Controller에서 creatorId, scheduleId를 받아 Service 단으로 넘긴다. ..코드 생략 /** * 일정 종료 * * @param requestScheduleClosed the

도착 여부 API 개발 [내부링크]

도착 여부 API Method: PUT URL: /schedule/arrived Request @RequestParam private String arrivedMemberId; private String scheduleId; Response Status Code: 200 OK Exception 404 ScheduleNotFoundException: scheduleId Not Found 400 NotCreatedScheduleByMemberException: This is not a user-created schedule 401: Unauthorized (추후에 추가할 예정) 500 updateQueryException: update Fail 500: Server ScheduleController Controller에서 arrivedMemberId, scheduleId를 받아 Service 단으로 넘긴다. ..코드 생략 /** * 도착 여부 * * @param requestSchedu

위도 경도 API 개발 [내부링크]

사용자 위도 경도 API Method: POST URL: /info Request @RequestBody private String memberId; private Double latitude; private Double longitude; Response Status Code: 200 OK Exception 404 UserNotFoundException: memberId Not Found 401: Unauthorized (추후에 추가할 예정) 500 updateQueryException: update Fail 500: Server ScheduleController Controller에서 memberId, latitude, longitude를 받아 Service 단으로 넘긴다. 조건을 두개로 분리하였다. 만약 기존의 위도/경도 정보가 없을 경우 save로 insert 쿼리문을.. 만약 원래 있었다면 update 쿼리문으로 설정하였다. ..코드 생략 /** * 위도/경도 * * @pa

검색 기록 API 개발 [내부링크]

사용자 검색 기록 입력 API Method: POST URL: /search Request @RequestBody private String memberId; private String searchHistory; Response private String searchHistoryId; Exception 404 UserNotFoundException: memberId Not Found 401: Unauthorized (추후에 추가할 예정) 500: Server SearchHistoryController Controller에서 memberId, searchHistory를 받아 Service 단으로 넘긴다. ..코드 생략 /** * 사용자 검색 기록 입력 * * @param requestSearchHistory the request search history * @return the response entity */ @PostMapping() public ResponseEntity<Res

친구요청 ERD에 대한 고찰 [내부링크]

사용자는 다른 사용자에게 친구요청을 보낼 수 있고 사용자는 여러 명에게 친구요청을 받을 수 있다. 이러한 관점을 시작으로 Entity 설계에 있어 관계를 어떻게 해석해 나가야할지 잘 모르겠다.. 프로젝트에서 FriendRequest 테이블을 통해 친구요청한 사용자를 모아놓는 Entity를 따로 설계했었다. 물론 Member와 FriendRequest는 1:N 관계로 해석될 수 있다. (Member는 여러 요청을 보낼 수 있기 때문) 애초에 FriendRequest(친구 요청. 즉, 친구 신청을 보냈지만 친구 수락을 하지 않아 친구 요청 대기 목록에 들어 있는 테이블)을 만든 이유가 Friend라는 테이블에 boolean으로 친구 수락 여부를 확인할 수 있지만, 친구 전체 목록을 가져와야하는 API. 혹은 친구 목록을 이용하는 API를 개발할 때 for문을 통해 Friend 테이블을 훑으며 boolean의 여부를 확인해 다시 List로 만들어야 한다고 생각하기 때문에 FriendReq

푸시알림 [내부링크]

사용자가 일정을 생성하면 같이 일정에 들어올 친구들을 추가하게 된다. 이 때, 일정에 들어온 친구들의 위도/경도 정보를 통해 실시간 GPS로 위치를 확인할 수 있기 때문에 일정 추가 시 친구들에게 푸시알림을 보내 동의여부를 확인할 수 있도록 설계해야한다. 푸시 알림을 구현할때 프론트에서만 구현할 수 없는지 생각했었지만 서버가 꼭 필요한 문제인 것 같다. 푸시알림을 클라이언트에서 관리한다면 시간 동기화 문제가 가장 큰 것 같다. 시간 동기화 문제란 핸드폰을 임의적으로 조작해서 공지를 자기만의 시간에 받게 하거나 할 수 있다는 뜻이다. 즉, 서버를 통해 공지를 만드는게 확장성과 시간 동기화 문제로부터 자유로워지는 것이다. 스프링 자체에서 푸시알림을 구현해도 되지만 직접 만드는 것보다 구글에서 지원하는 메시징 서비스를 사용하는 것이 훨씬 편리하다. FCM: Firebase Cloud Messaging 1. 여기서 이야기 하는 토큰은 Client App을 켜면 각각 Client App을 구

친구 그룹 ERD에 대한 고찰 [내부링크]

친구 요청 ERD에 이어서 친구 그룹에 대한 ERD도 개발하는 단계에서 다시 생각해보니 잘못 설계되었다고 생각이 들었다. 이전의 ERD는 FriendGroup(친구 목록) - Member(회원)에 대한 ERD만 구축하고 @ManyToOne, @OneToMany로 양방향 연관관계 매핑을 해줬었다. 근데 한 명의 Member는 여러개의 Group을 가질 수 있고, 그 Group안에는 여러명의 Member가 들어갈 수 있다. 이전의 FriendGroup ERD는 아래와 같다. @Entity @Data @AllArgsConstructor @NoArgsConstructor @Builder public class FriendGroup { @Id @GeneratedValue(generator = "uuid2") @GenericGenerator( name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator" ) @Column(name = "group_i

Response 값에 대한 고찰 [내부링크]

옛날부터 항상 의문이 있었던 문제였고 다른 FE 개발자들과 많은 이야기를 나누어 봤지만 결론이 나지 않았던 문제가 오늘 회의하면서 대두되었다. 데이터를 Response 값에 PK 값을 넘겨주어야하나. 완성된 데이터를 넘겨주어야하나 하는 문제였다. 완성된 데이터란 정말 필요한 데이터를 전부 Response로 받아 클라이언트에서 View로 띄워주기만 하면 되는 Response라고 생각하면 될 것 같다. 난 지금까지 PK 값을 넘겨주어 FE에서 한 번 더 API 통신을 하도록 항상 API 명세서를 짜왔고 프로젝트를 진행해왔다. 무슨 뜻인가 하면 아래와 같다. 만약 친구 목록을 불러오는 API가 있다고 가정해보면 Response에 두 가지의 경우가 있을 것이다. (Member Entity에는 단순히 nickName, name 두가지 항목만 있다고 가정) -- 첫번째 가능한 Response값. (위에서 이야기한 완성된 데이터) [ { "memberId": PK "nickName": "stri

공유 일정으로 기능 확장 [내부링크]

지금까지 일정을 만든 당사자만 볼 수 있도록 구현을 했었다. 그러나 오늘 회의하며 일정을 생성하면서 추가했던 친구들 또한 일정 초대를 수락하면 친구들도 일정을 같이 볼 수 있도록 코드를 리펙토링 해야 했다. 또한, 모든 일정은 Creator 즉, 일정을 만든 사람만 수정할 수 있도록 하였다. Schedule(일정 정보) - MemberSchedule(일정을 공유하는 Member) Entity에서 일정을 생성하면 Creator는 default로 accept를 true로 넣고 나머지 Member들은 일정을 수락하면 true로 변경하는 식으로 코드를 바꿨다. public ResponseSaveSchedule save(RequestSaveSchedule requestSaveSchedule) { /* 예외처리 404 UserNotFoundException: MemberId Not Found 400 FriendListNotFoundException: FriendListNot Found 400

일정 거절 API 개발 [내부링크]

일정 거절 API는 일정 생성자(Creator)가 일정을 생성할 때, 일정에 친구를 추가할 수 있다. 이때, 추가된 사용자는 해당 일정에 들어가고 싶지 않을때, 거절할 수 있는 기능이다. refuseSchedule 메소드를 구현하여 특정 사용자가 특정 일정에 대한 참여를 거부하고 해당 MemberSchedule 엔터티를 삭제하는 로직을 추가한다. 이 메소드는 RequestRefuseSchedule 객체를 매개변수로 받아, 주어진 refuseMemberId와 scheduleId에 해당하는 MemberSchedule을 찾아 삭제한다. /** * Refuse schedule. * * @param requestRefuseSchedule the request refuse schedule */ public void refuseSchedule(RequestRefuseSchedule requestRefuseSchedule){ // 거부하는 멤버 찾기 Member refuseMember = memb

친구 그룹 API 개발 [내부링크]

친구 그룹 생성 API 일정을 추가할 때, 친구를 추가하는 기능이 있기 때문에 미리 그룹을 지정하면 좋겠다 싶어 넣은 기능이다. UI 같은 경우는 아래와 같다. 먼저 Request와 Response 같은 경우는 아래와 같이 설정했다. Request { "naem": "String", "ownerId" : "String", "groupMemberId": [ "string" ] } Response { "groupId" : "String", } ERD 같은 경우도 일정과 같게 설계하였다. FriendGroup이라는 Entity에서 Group의 이름, 소유자등을 관리하고 FriendGroupMember에서 FriendGroup에 속하는 Member들을 관리하도록 설계하였다. 기본적인 Entity와 Repository의 설계는 아래와 같다. 그룹 추가 기능이기 때문에 따로 설계해야 할 것은 없지만 그룹 멤버를 추가할 때, Group을 먼저 생성하고 Group안에 있는 Member들을 추가하도

일정(Schedule) API 리팩토링 [내부링크]

개발이 끝나서 배포 과정 전까지 코드 리팩토링에 들어갈 생각이다. 리펙토링의 과정은 두 가지를 염두해서 리펙토링을 진행할 예정이다. 1. 하드코딩하지 않는다. Constant 변수로 뺄 수 있는건 다 빼도록 노력한다. 2. 메서드 하나당 하나의 역할만 하도록 분리한다. 일정 추가 API 리펙토링 기존의 일정 추가 API의 Service 같은 경우의 코드는 아래와 같다. /** * Save response save schedule. * * @param requestSaveSchedule the request save schedule * @return the response save schedule */ public ResponseSaveSchedule save(RequestSaveSchedule requestSaveSchedule) { Member creator = memberRepository.findById(requestSaveSchedule.getMemberId()) .orEls

일정 회원 목록(MemberSchedule) API 리팩토링 [내부링크]

MemberSchedule 같은 경우, Schedule이 공유 일정이기 때문에 MemberSchedule에서 Schedule에 들어있는 Member를 관리하는 DB이다. 스케줄 수락, 스케줄 거절 두 메서드만 있기 때문에 리팩토링하는데 오랜 시간이 들지 않았다. 스케줄 수락 API 리팩토링 기존의 스케줄 수락 API는 아래와 같다. 단순하게 Member와 Schedule을 가지고와 해당 MemberSchedule의 accept를 True로만 바꿔주면 된다. /** * Schedule accept. * * @param requestScheduleAccept the request schedule accept */ public void scheduleAccept(RequestScheduleAccept requestScheduleAccept){ Member acceptMember = memberRepository.findById(requestScheduleAccept.getAcceptMem

회원 위치 정보(MemberInfo) API 리팩토링 [내부링크]

앱 자체가 GPS 기반의 친구 위치 정보를 확인할 수 있기 때문에 사용자의 위도/경도를 관리하는 MemberInfo Entity가 필요했다. 이 Entity와 관련된 Service를 리팩토링할 계획인데, 사용자의 위도/경도를 저장, 가져오는 두 가지 API 밖에 없다. 사용자 위도/경도 저장 API 기존의 비즈니스 로직은 아래와 같다. 먼저 Request를 통해 Member를 가져온 후 MemberInfo Entity에 저장한다. 이때, 기존에 저장되어 있는 위도/경도 정보가 있다고 한다면 update쿼리문을 통해 위도/경도를 update해준다. 만약, 기존에 저장되어 있는 위도/경도 정보가 없으면 save 메서드를 통해 insert 쿼리를 날리게 된다. public void setMemberInfo(RequestMemberInfo requestMemberInfo){ memberRepository.findById(requestMemberInfo.getMemberId()) .orEls