eucis의 등록된 링크

키자드에 등록된 총 233개의 포스트를 확인하실 수 있습니다.

Naver Blog

데이터베이스 선정 과정 (RDBMS vs NoSQL)

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

Naver Blog

[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 텍스트 검색 요청 텍스트 검색 요청은 다음

Naver Blog

Batch Scheduler

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

Naver Blog

2024 열린데이터광장 공공데이터 활용 창업경진대회

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

Naver Blog

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

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

Naver Blog

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

Naver Blog

2024-03-11 ~ 2024-03-17 사이의 주요 뉴스

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

Naver Blog

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으로 응답하기를 기다린다.

Naver Blog

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보다 속도가 빠르며 네트워크 부하가 적다는 장점이 있지만, 신뢰성 있

Naver Blog

TCP vs UDP

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

Naver Blog

Spring Batch

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

Naver Blog

환율 정보 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 (인

Naver Blog

EC2 + Route53 + 가비아로 HTTPS 적용하기

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

Naver Blog

SpringBoot + Kafka 연동

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

Naver Blog

데이터 일괄 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

Naver Blog

SpringBoot 3.x + FeignClient + Querydsl의 JOIN

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

Naver Blog

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

Naver Blog

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 - 사용자

Naver Blog

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

Naver Blog

2024-03-04 ~ 2024-03-10 사이의 주요 뉴스

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

Naver Blog

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은 컴퓨터 그룹의 이름이라고

Naver Blog

2024-02-19 ~ 2024-02-25 사이의 주요 뉴스

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

Naver Blog

Transport Layer

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

Naver Blog

System Structure & Program Execution 1

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

Naver Blog

1과목: 데이터모델링의 이해

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

Naver Blog

2024-02-26 ~ 2024-03-03 사이의 주요 뉴스

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

Naver Blog

Gateway-Server JwtToken (Pre)Filter 적용 및 USER-SERVER에서의 Header Token 활용

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

Naver Blog

2024-02-12 ~ 2024-02-18 사이의 주요 뉴스

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

Naver Blog

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

Naver Blog

Introduction to Operating Systems

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

Naver Blog

Update 로직 수정(JPQL to JPA Dirty Checking)

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

Naver Blog

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이 장점이지만, 매 요청

Naver Blog

Session/Cookies/Token

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

Naver Blog

1과목: 소프트웨어 설계

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

Naver Blog

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

Naver Blog

2과목: 소프트웨어 개발

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

Naver Blog

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

Naver Blog

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) 프로그램이나 데이터가 들어갈

Naver Blog

데이터베이스 키(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명을 구분할

Naver Blog

IP Protocol

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

Naver Blog

Routing Protocol

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

Naver Blog

대칭키 vs 공개키(비대칭키) 암호화

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

Naver Blog

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의 유효 기간을 짧고 자주 재발급 하도록 만들어 보안을 강화하면서 사용자는 로그아웃 되어 다시 로그인해야 되는 상황을 주지 않도록 하기 위함입

Naver Blog

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

Naver Blog

네트워크 기초

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

Naver Blog

AWS Elastic Load Balancer

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

Naver Blog

Autoscaling

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

Naver Blog

AWS VPC

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

Naver Blog

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만 사용자들이 접근할 수

Naver Blog

생성자(Constructor)

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

Naver Blog

Compiler/Interpreter

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

Naver Blog

Hash(해시)

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

Naver Blog

추상클래스 VS 인퍼테이스

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

Naver Blog

AOP 적용 @ControllerAdvice/@RestControllerAdvice

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

Naver Blog

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 - 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. 모든 클래스는 각각 하나의 책임만 가져야 하며, 수정할 이유는 단 한 가지여야 합니다. 즉, 클래스는 그 책임을 완전히 캡슐화해야 함을 말합니다. 예를들어, 결제

Naver Blog

프로그래머스 &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

Naver Blog

프로그래머스 &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

Naver Blog

그래프(Graph)

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

Naver Blog

트리(Tree)

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

Naver Blog

IoC (Inversion of Control)

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

Naver Blog

DI(의존성 주입)

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

Naver Blog

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 : 노드의 개

Naver Blog

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

Naver Blog

Red Black Tree (레드 블랙 트리)

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

Naver Blog

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

Naver Blog

Heap(힙)

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

Naver Blog

Priority Queue (우선 순위 큐)

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

Naver Blog

DB Clustering & Replication

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

Naver Blog

프로그래머스 &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 이하

Naver Blog

인프런 &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번 위치의 스프링

Naver Blog

영속성 컨텍스트(Persistence Context)

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

Naver Blog

배열(Array)

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

Naver Blog

스프링 프레임워크(Spring Framework)

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

Naver Blog

교내 축구 동아리 프로젝트 개요

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

Naver Blog

객체지향 프로그래밍(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

Naver Blog

연결리스트(LinkedList)

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

Naver Blog

Stack & Queue

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

Naver Blog

인프런 &lt;CPU 스케쥴링&gt; JAVA

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

Naver Blog

옵티마이저(Optimizer)

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

Naver Blog

프로그래머스 &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는 제거해야 할 숫자의 개수입니다. 문제의 핵심은 최대한 큰 숫자를 유지하는 방

Naver Blog

프로그래머스 &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

Naver Blog

인프런 &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

Naver Blog

인덱스(index)

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

Naver Blog

프로그래머스 &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)이 주어집니다. 목표는 모든 섬들이 서로 통행 가능하게 최소 비용으로 다리를 건설하는 것입니다. 다리가 중간 섬을 통해 간접적으로 연결되어 있어도 통행 가능

Naver Blog

프로그래머스 &lt;단속카메라&gt; JAVA

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

Naver Blog

인프런 &lt;현관문 출입 순서&gt; JAVA

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

Naver Blog

Join의 종류

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

Naver Blog

프로그래머스 &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를 여러 번

Naver Blog

프로그래머스 &lt;정수 삼각형&gt; JAVA

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

Naver Blog

인프런 &lt;피부과&gt; JAVA

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

Naver Blog

DB Lock

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

Naver Blog

프로그래머스 &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로 주어집니다. 오직 오른쪽 또는 아래쪽으로만 이동할 수 있습니다. 최단

Naver Blog

프로그래머스 &lt;피로도&gt; JAVA

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

Naver Blog

인프런 &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

Naver Blog

프로그래머스 &lt;전략망을 둘로 나누기&gt; JAVA

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

Naver Blog

프로그래머스 &lt;체육복&gt; JAVA

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

Naver Blog

인프런 &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]의 값은

Naver Blog

Transaction (트랜잭션)

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

Naver Blog

앱 배포 서버 분리 (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파일을

1 2 3