hstory0208의 등록된 링크

 hstory0208로 등록된 티스토리 포스트 수는 346건입니다.

[Spring] kafka와 SSE(Server Send Event)를 사용한 실시간 알림 전송 방법 [내부링크]

Kafka 선택 이유 알림 전송에 Kafka를 도입한 이유는 다음과 같다. 필자의 과일샵 쇼핑몰 프로젝트는 아래 처럼 회원 서버와 어드민 서버로 나뉘어져 있다. 두 서버가 DB는 공유하고 있지만 ,어드민 서버에서 발생한 이벤트를 실시간으로 회원 서버로 전달할 수가 없었다. 바로 이 문제를 해결하기 위해 Kafka를 도입하게 되었다. Kafka외에도 RabbitMQ나 Redis를 고려 해 볼 수도 있었지만, 분산 시스템이 적용되어 있는 큰 기업들에서 사용하고 있어 경험해보기 위해 Kafka를 선택하게 되었다. [Kafka] 카프카란 ? 주요개념 정리 및 Pub/Sub 모델 비교 카프카(kafka) 란? Kafka는 대규모 실시간 데이터 스트리밍을 처리하는 데 사용되는 분산 이벤트 스트리밍 플랫폼이다. 먼저..

[Kafka] 카프카란 ? 주요개념 정리 및 Pub/Sub 모델 비교 [내부링크]

카프카(kafka) 란? Kafka는 대규모 실시간 데이터 스트리밍을 처리하는 데 사용되는 분산 이벤트 스트리밍 플랫폼이다. 먼저 "분산 이벤트 스트리밍"이라는 용어에 대해 알아보자 분산 이벤트이라는 말은 여러 대의 서버(노드)에 분산되어 저장된 이벤트(데이터) 를 말한다. 이벤트 스트리밍은 대량의 이벤트(데이터)를 실시간으로 처리하는 방식을 의미한다. 즉, 이 두 내용을 연결 시키면 분산 되어 있는 이벤트(데이터)들을 실시간으로 처리하는 플랫폼이라는 뜻이 된다. 위 그림의 왼쪽은 링크드인에서 개발한 카프카가 등장하기전의 아키텍처 모습니다. 각 데이터 저장소들이 도착지점까지 모든 시스템을 거치는 End - To - End 연결로 매우 복잡한 것을 볼 수 있다. 하지만 카프카가 적용된 오른쪽 그림을 보면 ..

실시간 알림 - SSE(Server Sent Event), Websoket 차이점 정리 [내부링크]

판매자가 회원의 리뷰에 답글을 달면 위와같이 알림 메세지를 보내는 기능이 필요했다. 현재는 답글을 달 경우 "어드민 서버"에서 Kakfa로 메세지를 보내고, "회원 서버"에서는 해당 topic을 구독하는 회원들에게 전달 받은 메세지를 SSE로 프론트에 뿌려주도록 구현했다. DB에 저장하는 것 만으로 알림은 충분히 구현이 가능하다. 다만 위 처럼 실시간으로 알림을 보내줄순 없다. 실시간 알림을 구현하는 경우 대표적으로 SSE, Websoket, Polling 3가지가 있다. 이번 포스팅에서는 자주 사용되는 SSE와 Websoket에 대한 차이점에 대해 이야기하고, SSE를 사용해 해당 실시간 알림을 구현한 이유에 대해 설명하고자 한다. SSE vs Websoket SSE (Server Send Event)..

spring_session' doesn't exist 세션 테이블 생성이 안되는 오류 [내부링크]

유저 서버와 어드민 서버를 분리하면서 유저 서버는 session 저장소를 redis, 어드민은 jdbc로 가져가도록 했다. 어드민은 jdbc로 가져가게 된 이유는 어드민 유저의 수는 일반 유저에 비해 많이 적기 때문에 세션 I/O 과정에 부하가 적어 선택하게 되었다. (유지 보수 비용도 고려) 세션 저장소로 jdbc로 사용하려면 아래와 같이 프로퍼티 파일에 옵션을 주면된다. spring.session.store-type=jdbc 하지만 이렇게 설정을하고 실행을 하면 spring_session 테이블이 생성이 안되었다는 에러가 발생할것이다. 문제 해결 만약 프로젝트에서 사용하는 데이터베이스가 embeded 타입이라면 spring_session 테이블은 자동 생성되도록 기본 설정 되어 있다. 하지만 나는 e..

[Spring Security] 일반 로그인 & 소셜 로그인 분리 및 Security 로그인 비동기 처리 방법 [내부링크]

우리의 서비스는 자체 회원가입을 통해 가입한 유저 로그인, 소셜 계정을 통해 가입된 유저 로그인 2가지 로그인 방식을 지원한다. 처음에는 일반 로그인만 구현해놓고 소셜 로그인은 후반에 적용하게 되었다. 그래서 일반 로그인은 자체 로그인 로직으로, 소셜 로그인은 스프링 시큐리티로 로그인을 구현이 되었다. 그런데 여기서 문제가 발생하게 되었다. 소셜 로그인은 사용자의 권한을 잘 읽어오지만 일반 로그인을 한 회원은 사용자의 권한을 읽어오지 못해 권한 설정을 한 페이지에 접근할수가 없는 문제가 발생하는 것이다. 문제 발생이유 기존에는 소셜 로그인은 시큐리티로 처리했지만, 일반 로그인 같은 경우는 아래처럼 요청을 받아 유효성검사를 하고 결과를 반환해주는 식이였다. 하지만 이런식으로 일반 로그인을 처리할 경우에는 ..

[Spring] 자체 서비스 회원과 소셜 로그인 회원 통합 관리 방법 [내부링크]

우리 서비스는 쇼핑몰을 통한 회원 가입 및 로그인, 그리고 소셜 계정을 통한 회원 가입 및 로그인을 지원한다. (카카오, 네이버, 구글) 이 글을 포스팅하는 이유는 소셜 로그인을 뒤 늦게 적용하게 되었는데 소셜 로그인을 적용하고 난뒤에 기존 쇼핑몰 회원과 소셜 계정을 통해 가입한 회원을 관리하는데 문제가 발생하게 되어서 그 문제점을 해결한 방법에 대해 포스팅하고자 한다. 문제 발생 상황 문제점 1. 소셜 로그인 구글 이메일이 a@, 나머지 이메일은 b@일 때 쇼핑몰을 통해 회원가입한 유저의 이메일이 b@ 일 경우 이메일 중복 문제가 발생해 이메일이 같은 경우 b@이메일 유저의 세션을 사용하는 문제. 2. 소셜 로그인은 보안상 비밀번호를 받아올 수 없기 때문에 소셜 로그인한 회원은 비밀번호 찾기가 불가..

[Spring + Redis] Redis cache를 적용해 조회 성능 개선 방법 [내부링크]

내 프로젝트에서는 사용자별로 사이드바에 찜 수, 장바구니 수들을 카운트 쿼리로 반환된 데이터 수를 view에 뿌려주는데, 이 사이드바는 여러 페이지에서 노출되어 페이지 이동마다 카운트 쿼리를 자주 호출하고 있었다. 그렇기 때문에 매번 카운트 쿼리를 호출하지 않고 해당 데이터를 캐시 처리하여 카운트 수가 변경되지 않을 경우에 Redis 캐시에서 해당 데이터 수를 반환하도록 하여 DB의 부담을 줄이도록 하였다. 레디스에 대해 알고 싶다면 아래 포스팅에서 설명한다. [Redis] 레디스란? 특징, 활용예시, 비교 정리 레디스란? Redis는 Remote Disctionary Server의 약자로 키(Key) : 값(Value) 해시 맵과 같은 구조를 가진 NoSQL 데이터베이스이다. MySQL, Oracle같..

[Redis] Redis에 로그인 Session정보를 저장하여 사용하기 (세션 불일치 해결) [내부링크]

서버가 한대일 경우에는 해당 서버에 세션 정보를 저장해서 사용할 수 있겠지만, 대용량 트래픽을 고려해 Scale-out이 적용된 환경에서는 세션 불일치 문제가 발생할 수 있다. Scale-out은 여러 대의 서버로 트래픽을 분산하기 때문에 로드 밸런싱이 필수로 적용되는데, 이 로드 밸런싱으로 인한 분산 처리 과정에서 서버마다 가지고 있는 세션 저장소에 있는 세션을 공유하지 않기 때문에 세션 불일치 문제가 발생할 수 있다. 이런 세션 불일치 문제가 발생하면 새 요청을 할 때마다 로그인을 해야하는 아주 좋지 않은 사용자 경험을 발생시킬 것이다. 이 세션 불일치 문제를 해결하기 위한 방법으로 아래 3가지 방법들이 있다. Sticky Session Session Clustering Session Storage ..

[Redis] 레디스란? 특징, 활용예시, 비교 정리 [내부링크]

레디스란? Redis는 Remote Disctionary Server의 약자로 키(Key) : 값(Value) 해시 맵과 같은 구조를 가진 NoSQL 데이터베이스이다. MySQL, Oracle같은 일반 DB와 다르게 하드 디스크(SSD, HDD)에서 데이터를 처리 하는 것이 아니라, Redis는 In-Memory(인메모리) 기반의 DB로 메인 메모리(DRAM)에서 데이터를 처리하기 때문에 작업 속도가 월등히 빠르다. DRAM과 SSD, HDD의 비교 메모리 계층 구조는 다음과 같이 여러 계층이 있지만 인메모리DB와 일반 DB를 비교하기 위해 2가지에 대해서만 비교 하고 넘어 가고자 한다. 특징 DRAM (메인 메모리) SSD, HDD (하드 디스크) 가격 하드 디스크 보다 비쌈 제일 저렴 지속성 휘발성 ..

[Spring] 아임포트(import)로 결제 취소, 환불 기능 구현하기 [내부링크]

결제 취소 기능에 대해 포스팅하기 앞서 iamport를 사용하기 위한 준비과정 및 결제 기능 구현하는 방법에 대해서는 아래 포스팅에 설명되어 있다. [Spring] 아임포트(import)로 결제 기능 구현하기 (클라이언트 + 서버 코드 포함) import 란? 아임포트는 쇼핑몰 서버를 대신해서 쇼핑몰에서 사용자가 상품을 구매하려 할 때 실제 결제 요청 받는 역할을 하고 이 요청을 받아서 PG(결제 대행 업체)에 요청을 해준다. 그리고 결제 hstory0208.tistory.com 결제 취소 기능 구현 상품을 결제했으면 당연히 취소도 가능해야한다. 그렇기 때문에 결제 취소 로직을 추가하였다. 아래에서 설명하는 iamport에 결제 취소 요청을 보내는 코드를 구현하면 결제 완료된 상품에 대한 상품에 대한 결..

application.properties의 키 값이 @Value를 선언한 필드 값에 주입되지 않는 문제 [내부링크]

결제 시스템으로 iamport api를 사용하기 위해 IamportClient 객체를 apikey로 생성하는데 이 apikey를 application.properties에 작성하고 @Value 어노테이션으로 키 값을 받아오는데 해당 필드에 키값이 채워지지 않는 문제가 발생했다. @Controller @RequiredArgsConstructor public class OrderController { private final OrderService orderService; @Value("${imp.api.key}") private String apiKey; @Value("${imp.api.secretkey}") private String secretKey; private IamportClient iampor..

[Spring] 아임포트(import)로 결제 기능 구현하기 (클라이언트 + 서버 코드 포함) [내부링크]

import 란? 아임포트는 쇼핑몰 서버를 대신해서 쇼핑몰에서 사용자가 상품을 구매하려 할 때 실제 결제 요청 받는 역할을 하고 이 요청을 받아서 PG(결제 대행 업체)에 요청을 해준다. 그리고 결제 정보 결과에 대해서 응답을 받을 수 있다. 그렇기 때문에 웹 서버의 부담을 줄일 수 있고, PG사 별로 결제를 요청하는 코드를 작성해야하는 번거로움도 사라지게 된다. iamport는 가이드를 아주 친절하게 제공해주고 무엇보다 한국어로 되어 있어서 보기 편할 것이다. iamport 가이드 iamport 개발자 가이드 ( Notion ) : https://guide.portone.io/test_integration PG 사별 코드표 : https://portone.gitbook.io/docs/tip/pg-2 결..

[Spring] 로그인 어노테이션으로 세션 정보가져오기 (Argument Resolver 활용) [내부링크]

로그인 사용자에 대한 기능들을 구현하다보면 로그인 사용자의 Session 정보를 활용할 일이 정말 많다. 그렇다 보니 Session 정보를 가져오는 코드마다 아래의 코드가 반복될 것이다. SessionUser user = (SessionUser) httpSession.getAttribute("loginUser"); 이 같은 코드가 반복되는 것을 방지하고자 Spring의 argument resolver를 활용하여 메서드 파라미터의 SessionUser 앞에 @Login 어노테이션을 붙여 세션값을 바로 받아 올 수 있도록 구현할수 있다. 또한 사용자별 세션 정보를 갖고 있으므로, 사용자별로 서로 다른 페이지 내용을 볼 수 있다. ( ex: 마이페이지 ) SessionUser 클래스 세션에 저장할 사용자의 정..

[OOP] 디미터 법칙에 대한 오해와 디미티 법칙에 대해 [내부링크]

객체지향 프로그래밍을 잘 하기 위한 9가지 원칙을 준수해가며 코드를 리팩토링 하는 과정에서 디미터 법칙에 대한 오해가 한 가지 생겼습니다. Enum 클래스의 경우 열거형 상수 값을 가져 올 때 GameMessage.START.getMessage() 이런 식으로 코드 한줄에 점(.)이 2번 들어가게됩니다. 바로 여기서 오해가 생기게 되었습니다. 디미터 법칙은 코드 한줄에 점(.)을 하나만 허용해야 한다고 되어 있는데, "점(.)이 2번 들어갔으니 이건 디미터 법칙 위반아니야 ?" 라는 오해가 생겼는데요. 이 오해에 대해 정리한 제 생각을 공유해보자고 합니다. 디미터 법칙이란? 디미터 법칙은 결합도가 낮은 설계를 위해 생긴 규칙이지, 점(.) 이 몇번 쓰였냐가 중요한게 아니라 객체지향 측면에서 바라봐야한다고..

[InteliJ] 라이브 템플릿을 이용해 원하는 주석을 자동완성 되도록 세팅해보자. [내부링크]

보통 테스트 코드를 작성할 때 아래와 같이 주석을 사용해 3단계로 분리하여 작성하곤 한다. 하지만 여러 테스트 코드에 저 주석들을 일일히 줄바꿈해가며 작성하는 건 상당히 번거로운 일이다. 우리는 이 번거로운 일을 해결해줄 인텔리제이의 "라이브 템플릿"을 이용해 특정 단축키를 입력하면 위와 같은 주석이 자동 완성 되도록 세팅해보자. 1. 인텔리제이 설정(Preferences) -> 에디터(Editor) -> 라이브 템플릿(Live Templates) 2. Java 클릭 -> 우측 파란색 + 버튼 클릭 -> 1 라이브 템플릿 클릭 3. 약어 , 템플릿 텍스트 입력 약어는 설정 한 값을 입력하면 템플릿 텍스트에 작성한 코드가 자동완성되어 나타나도록 하는 단축 명령어이다. (iter를 입력하면 for 구문이 자..

구글 서치콘솔 소유권 인증 HTML 태그 확인하는 방법 [내부링크]

이번에 티스토리 스킨을 변경하고 나서 초기화 된 Meta Tag를 새로 등록하게 되었다. 구글 서치콘솔에서 소유권 인증 HTML 태그를 찾았는데 아래처럼 HTML 태그 클릭이 안되서 알 수가 없었다. HTML 태그 찾기 서치콘솔을 아무리 뒤져보아도 HTML 태그 값을 찾을 수가 없었는데 대체 어디에 있을까? 모든 버튼들을 클릭해보며 뒤져본 결과 아래 방법으로 찾을 수 있었다. 1. "설정 -> 소유권 인증" 페이지에서 아래의 "자세히 알아보기" 클릭 2. 클릭 시 나오는 아래 페이지에서 "사용자 및 권한 관리" 클릭 3. 그 다음 나오는 페이지에서 "속성 검색"을 클릭 해 현재 연결된 블로그 링크 클릭 4. 오른쪽의 3개의 점선 버튼을 클릭하면 "소유권 인증 세부정보"가 나온다 이를 클릭 5. 그러면 다..

JWT란? 장단점과 Session 인증 방식과의 차이점을 알아보자. [내부링크]

인증과 인가 JWT와 Session은 서버가 인증을 처리하는 방식으로 먼저 "인증과 인가"의 개념에 대해 알 필요가 있다. 인증 인증은 말 그대로 사용자의 신원을 확인하는 것으로, 특정 인증 요청(로그인, 이메일 인증 등)이 유효한 사용자인지를 검증하는 과정이다. 만약 인증 과정이 없다면 어떻게 될까? 인증되지 않은 사용자가 마음대로 상품 정보를 수정하고 주문하는 등 악의적인 행동을 할 수 있을 것이다. 그래서 인증 절차를 통해 서버가 인증된 사용자를 검증하는 과정이 필요하다. 인가 인가는 이미 인증된 사용자에게 특정 자원에 대한 접근 권한을 부여하는 과정이다. 예를 들어 일반 사용자 "USER"와 관리자 "ADMIN"이 있다고 가정해보자. USER는 ADMIN에 접근 할 수 없어야하고 ADMIN은 US..

[Spring] ELK + Kafka를 활용해 실시간 로그 수집하기 [내부링크]

ELK 도입 이유 ELK가 무엇인지에 대해 알아보고 싶다면 아래 포스팅을 참고. [ELK] ElasticSearch란? ELK란? 내부 구조, 장단점, RDB와 차이 ElasticSearch란? Elasticsearch는 Apache Lucene기반의 Java 오픈 소스 분산 검색 엔진이다. Elasticsearch를 통해 방대한 양의 데이터를 신속하게(거의 실시간) 저장, 검색, 분석을 수행할 수 있다. Elasticsearch는 hstory0208.tistory.com ELK를 적용한 이유 필자의 쇼핑몰 서비스는 아래 처럼 사용자 서버와 관리자 서버가 분리되어 있다. 이렇게 분리된 서버를 관리하기 위해서 ELK를 적용하기전에는 어디서 어느 시점에 장애가 발생했는지 확인하려면 실행되는 서비스의 로그를 ..

[ELK] ElasticSearch란? ELK란? 내부 구조, 장단점, RDB와 차이 [내부링크]

ElasticSearch란? Elasticsearch는 Apache Lucene기반의 Java 오픈 소스 분산 검색 엔진이다. Elasticsearch를 통해 방대한 양의 데이터를 신속하게(거의 실시간) 저장, 검색, 분석을 수행할 수 있다. Elasticsearch는 검색 엔진으로 단독으로 사용되기도 하며, ELK(Elasticsearch / Logstash / Kibana) 스택으로 사용되기도 한다. 이러한 Elasticsaerch는 대규모 로그 파일 관리나 실시간 검색 서비스 등과 같이 대용량 데이터를 빠르게 처리해야 하는 경우 유용하게 사용될 수 있다. 데이터 저장 방법 (RDBMS와 차이점) RDB는 정규화된 스키마에 따라 데이터를 구조화하지만, Elasticsearch는 JSON 문서 형태로 ..

[ELK] Logstash 401 Unauthorized 에러 [내부링크]

Kibana에 로그가 전달이 되질 않아서 Docker Desktop으로 logstash의 로그를 확인해보니 다음과 같은 에러가 발생했다. [2023-10-04T08:03:23,112][WARN ][logstash.outputs.elasticsearch][main] Attempted to resurrect connection to dead ES instance, but got an error {:url=>"http://logstash_internal:xxxxxx@elasticsearch:9200/", :exception=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError, :message=>"Got response code '..

Docker Desktop WSL 2 based engine 끄고 Hyper-V 활성화 방법 [내부링크]

WSL 2를 사용하지 않고 Docker Desktop의 Hyper-V 기반 엔진을 사용하려면, 먼저 Hyper-V를 활성화해야한다. 1. "제어판" -> "프로그램 및 기능" 으로 이동 그리고 Windows 기능 켜기/끄기 클릭 2. Hyper-V 체크 3. Docker Desktop 설정에서 "Use the WSL 2 based engine" 옵션 체크 해제 후 재시작 4. 이제 이 이후에 도커 컨테이너 실행시 나오는 알림창 Share it을 클릭해주면 정상적으로 권한 문제 없이 파일 공유가 가능하다.

[무중단 배포] Nginx를 사용해 EC2에 무중단 배포 적용하기 [내부링크]

무중단 배포란? 단순히 CI / CD만 적용하면 배포단계에서는 애플리케이션이 종료된다는 문제가 있다. 만약 실제 서비스에서 사용자들이 서비스를 이용하는 도중에 갑자기 서비스가 중단된다면 좋지 않은 사용자 경험을 줄 것이다. 이 문제를 해결 해주는 것이 바로 "무중단 배포"이다. 무중단 배포는 말 그대로 서버를 중단 없이 배포하는 것이다. 무중단 배포에 대한 더 자세한 내용은 아래 포스팅에서 설명한다. 무중단 배포란? 무중단 배포 전략에 대해 알아보자. 무중단 배포란? 무중단 배포를 사용하지 않을 경우 실제 서비스를 서버 한대만을 사용해 운영한다고 가정해보자. 현재 서비스 중인 서비스는 application-V1을 배포한 서비스이다. 그런데 기능이 업 hstory0208.tistory.com 무중단 배포를..

[ElastiCache Redis] ElastiCache Host 연결 문제 (RedisConnectionFailureException) [내부링크]

프로젝트의 서버로 EC2를 사용하면서 기존에서 로컬에서 사용하던 redis를 AWS의 ElastiCache를 사용하는 방법으로 변경했다. 그런데 호스트의 주소를 잘못 적었는지 계속 위와 같은 연결 문제가 있었다. ElastiCache Redis를 생성하면 다음과 같이 마스터 노드와 내구성을 위해 읽기 전용인 노드가 2개가 기본으로 생긴다. 처음에는 읽기전용인 마스터 노드의 엔드포인트를 호스트로 작성해줘야하는 줄 알고 "리더 엔트포인트"를 호스트로 작성했다가 연결오류가 발생했다. 이렇게 지정하니 Read Only ~ 에러가 발생하면서 읽기 전용 노드에 접근하려고 하고 있었다. 그래서 이번에는 노드 중 primary를 지정해서 호스트 엔드포인트를 작성했다. 이제는 ReadOnly는 발생하지 않지만 Redis..

[Spring] no main manifest attribute 에러 [내부링크]

무중단 배포를 하는 도중에 jar 파일이 실행되지 않아서 계속 heath 체크가 실패하는 문제가 발생했다. 원인을 찾고자 해당 jar 실행 로그가 들어있는 파일을 열어 봤더니 아래 로그만 덩그러니 있었다. no main manifest attribute, in /home/ec2-user/app/deploy/mall-1.0.1-SNAPSHOT-20230927114334-plain.jar 이 에러는 jar파일에서 애플리케이션이 실행되는 @SpringBootApplication이 붙은 메인 클래스를 찾지 못했다는 뜻이다. java -jar로 jar파일을 실행 시키면 JVM이 jar파일의 메인 클래스를 호출하는데 이를 찾지 못해서 발생하는 문제이다. Spring boot 2.5.0 버전 이상 부터는 gradle..

[Spring AOP] 모든 페이지의 공통 헤더 영역에 공통 데이터 Model에 담아 전달 [내부링크]

아래와 같이 모든페이지에는 Layout으로 적용한 Header 부분이 공통적으로 들어간다. 그렇기 때문에 모든 페이지에서 해당 알림 데이터 리스트들이 필요하다. 하지만 현재 해당 헤더가 적용된 view를 반환하는 컨트롤러 코드들은 로그인과 회원가입 페이지들을 제외하면 총 9개가 있다. 이 많은 컨트롤러마다 일일히 패키지를 열어서 알림 테이블에서 회원별 알림 내역을 조회한 데이터들을 model에 담아 일일이 View에 뿌려줘야할까? 공통으로 사용되는 부분을 단순 반복 작업을 통해 추가하는건 너무 개발자스럽지 않다. 이 공통으로 사용되는 로직을 스프링 AOP를 적용해 해당 Contoller들의 Model에 알림 데이터들을 추가 해보자. AOP 적용 우선 먼저 build.gradle에 해당 의존성을 추가해주어..

[Spring] Cookie(쿠키)를 활용한 최근 본 상품 기능 구현 (Session과 비교) [내부링크]

그림과 같이 클릭했던 상품들을 "최근 본 상품"이라는 목록에 보여주는 기능을 추가하게 되었다. 이 기능을 구현하기 위해서는 Cookie와 Session을 사용해 구현할 수 있는데, 여기서 고민에 빠졌다. 고민하게 된 이유는 다음과 같다. Cookie와 Session방식을 통해 "최근 본 상품"기능을 구현했을 때의 장단점 먼저 Cookie는 기본적으로 문자열 형태로 데이터를 저장하며, 복잡한 데이터 타입인 리스트(List)와 같은 자료구조를 그대로 Cookie에 저장하는 것은 지원되지 않는다. 그렇기 때문에 복잡한 데이터 타입을 저장하려면 추가적인 로직이 필요하다. (필자는 objectMapper로 JSON 데이터로 변환하여 저장하였다.) 게다가 최근 본 상품에는 이미지URL로 해당 상품의 이미지를 보여준..

[Spring] 공통 기능을 @Aspect를 사용해 적용하기 [내부링크]

아래와 같은 사이드바에 장바구니에 담긴 상품 개수, 찜 개수, 최근 본 상품이 표시되도록 하는 기능을 구현하게 되었다. 그런데 개수 같은 경우에는 count 쿼리로 구해 model에 담아 view넘기는데 이 사이드바가 메인, 장바구니, 결제, 상품상세 페이지 등에 적용이되어서 해당 컨트롤러들마다 count 쿼리를 날리는 건 낭비라 생각해 @Aspect로 AOP를 적용하게 되었다. AOP 적용 아래는 사이드바에 공통으로 적용할 코드들을 담은 Aspect를 적용한 클래스이다. @Aspect @Component @Slf4j @RequiredArgsConstructor public class SidebarAspect { private final LikeService likeService; private fina..

[Spring] GET요청으로 url 쿼리 파라미터에 포함된 JSON 데이터 사용하기 [내부링크]

적용하게 된 이유 장바구니에 있는 상품들 중에 체크박스가 활성화된 상품들만 결제 페이지로 넘기는 작업을 진행하면서 해당 상품들만 어떻게 GET 요청에 담아서 보내야할까? 라는 의문이 들었다. 처음에는 체크박스가 활성화된 상품들을 배열에 담아 해당 배열을 보내주어야 하는데 처음에는 axios를 통해 비동기로 POST 요청으로 해당 상품들의 정보들을 JSON 객체로 넘겨주려했었다. 하지만, 비동기로 요청하게 되면 컨트롤러에서 view를 반환할 때 해당 view에 체크박스가 활성화된 상품들의 데이터를 model에 담아 넘겨줘야하는데 요청에 대한 응답을 성공적으로 넘겨준후에 axios의 then 구문으로 넘어가게되면서 해당 데이터를 넘겨주기 힘들어지는 문제가 발생했다. (해당 위 방법으로 해결 할수 있을 수도 ..

[MySQL] 이벤트 스케쥴러와 프로시저 (매일 특정 시간에 CRUD 작업 실행) [내부링크]

MySQL에 주기적으로 특정시간에 DB에 어떤 작업을 해주어야 할 상황이 생길 때가 있다. 나는 이번에 쇼핑몰 프로젝트를 진행하면서 "장바구니에 담긴 상품은 최대 15일까지 보관되며 자동으로 삭제됩니다." 라는 장바구니의 정책이 있어서 이를 MySQL의 이벤트 스케쥴러와 프로시저를 활용하여 매일 자정에 15일이 지난 상품을 장바구니 테이블에서 삭제하도록 만들었다. 프로시저(Procedure) 프로시저는 MySQL의 함수(메서드)를 만드는 것이라고 보면 된다. 실행할 쿼리문을 함수로 빼서 재사용가능하고, 이 프로시저의 쿼리에 조건문이나 반복문도 함께 사용할수가 있다. 프로시저 생성 나같은 경우에는 현재날짜와 cart 테이블에 데이터가 생성된 시점을 비교해 15일이 지났으면 삭제하는 간단한 프로시저를 만들었..

[TinyMce] 텍스트 에디터 적용하기 (+ 에디터 이미지 업로드) [내부링크]

이번 프로젝트에서 어드민 페이지 상품 등록 화면의 상세설명 부분에 아래와 같이 TinyMce 에디터를 적용하게 되었다. TinyMce 에디터를 사용하면 위와 같은 텍스트 편집기를 추가할 수 있는데 이번 포스팅에서는 TinyMce를 JavaScript로 적용하는 방법에 대해 설명하고 에디터를 커스터마이징하는방법에 대해 포스팅하려한다. TinyMce 적용방법 TinyMce Api Key 발급 tinymce를 적용하기전에 먼저 아래의 공식 홈페이지에 들어가서 회원가입 후 API KEY를 발급받아야한다. The Most Advanced WYSIWYG Editor | Trusted Rich Text Editor | TinyMCE TinyMCE is the most advanced WYSIWYG HTML edito..

@ModelAttribute 객체가 바인딩 되지 않는 오류 [내부링크]

이번 프로젝트를 진행하면서, 요청으로 받은 파라미터들이 @ModelAttribute 객체에 바인딩이 되지 않는 이슈를 겪어 이에 대해 정리해보고자 한다. 지금 진행하는 프로젝트에서 JPA와 MyBatis를 함께 사용하는 것이 아닌 오로지 MyBatis만 사용하면서 기존의 방식과 다른점으로 머리속이 복잡해지면서 많은 오류를 겪었다. JPA에서는 Entity 객체에 @Entity 어노테이션을 붙여 테이블이 생성하도록 해준다. @Entity 객체에 기본 생성자가 없을 경우에는 JPA가 작동하지 않을 것이다. 그 이유는 JPA는 Reflection API라는 것을 사용하여 객체를 생성해 기본 생성자가 필요하기 때문이다. 그래서 보통 Entity 객체에는 기본 생성자와 값 생성자가 포함된다. 그리고 Setter ..

@ModelAttribute가 객체에 바인딩하는 과정 및 방법 [내부링크]

@ModelAttribute 이 어노테이션은 보통 컨트롤러 메서드의 파라미터 객체의 앞에 사용되며 HTTP 요청을 받으면 HTTP 요청 파라미터를 자동으로 자바 객체에 바인딩 해준다. 요청을 처리하는 스프링 어노테이션으로 주로 @ModelAttribute와 @RequestBody가 많이 헷갈리는데 @ModelAttribute는 content-type이 application/x-www-form-urlencoded인 경우 즉 태그를 통해 제출한 데이터를 받아 객체로 변환하고, @RequestBody는 message body를 통해 넘어온 JSON이나 XML 형식들을 받아 객체로 변환한다. 이 두 어노테이션에 대한 차이는 아래 포스팅을 참고하여 알아 볼 수 있다. 2023.07.05 - [JAVA/Spring..

데이터베이스 정규화(Normalization)란? 예시를 통해 쉽게 이해해보자 [내부링크]

정규화란? 데이터베이스 정규화는 데이터베이스 내의 데이터 구조를 조직화하고 최적화하는 과정이다. 정규화를 하는 목적은 데이터 중복을 제거하고, 효율성을 향상시키며, 데이터 무결성을 보장하기 위함이다. 데이터 정규화에는 다음과 같이 여러 단계가 있다. 제1 정규화 (1NF) 제2 정규화 (2NF) 제3 정규화 (3NF) 이상 종류 이상 종류란 정규화를 거치지 않은 데이터에서 발생할 수 있는 현상을 말한다. 삽입 이상 (Insertion Anomaly) : 데이터 삽입 시 의도와 다른 값들도 삽입 삭제 이상 (Delete Anomaly) : 데이터 삭제 시 의도와 다른 값들도 연쇄 삭제 갱신 이상 (Update Anomaly) : 속성값 갱신 시 일부 튜플만 갱신되어 모순 발생 제1 정규화 (1NF) 데이터..

[비동기 통신] Ajax와 Axios의 차이점? [내부링크]

Ajax와 Axios는 웹 개발에서 비동기 통신으로 데이터를 주고받기 위해 사용되는 기술들이다. 이 두 기술들에 대해 혼동이와서 어떤 차이점이 있는지 정리해보려 한다. 비동기 통신에 대해 쉽게 이해하고 싶다면 아래 링크를 참고하면 도움이 된다. 동기와 비동기의 개념 및 차이에 대해 쉽게 알아보자. 동기(Synchronous) 방식 동기란, 말 그대로 동시에 일어난다는 뜻입니다. 요청을 하면 동시에 응답을 한다는 약속으로, 바로 요청을 하면 시간이 얼마가 걸리던지 요청한 자리에서 응답(결과)가 주 hstory0208.tistory.com Ajax (Asynchronous JavaScript and XML) Ajax는 약자 그대로 JavaScript, XMLHttpRequest 객체를 사용하여 웹 브라우저와..

Spring Data JPA + QueryDSL 페이징 처리 [내부링크]

이번 포스팅에서는 QueryDSL과 Spring Data JPA를 함께 사용해 페이징 처리하는 방법에 대해 알아보고자 한다. 다음은 이번 포스팅에서 사용할 QueryDSL 사용자 정의 레포지토리 인터페이스와 이를 구현한 구현체 이다. 이 내용에 대해 알고 싶으면 아래 링크를 참고 하면 도움이 된다. 2023.07.10 - [오픈소스] - QueryDSL Repository 생성하기 (사용자 정의 리포지토리) public interface MemberRepositoryCustom { Page searchPage(MemberSearchCondition condition, Pageable pageable); } @RequiredArgsConstructor public class MemberRepositoryI..

QueryDSL 동적 쿼리를 작성하는 방법에 대해 알아보자. [내부링크]

QueryDSL을 사용하는 이유는 아마 동적 쿼리를 아주 쉽게 해결할 수 있어서가 아닐까 싶다. 이번 포스팅에서는 QueryDSL을 사용해서 동적 쿼리를 작성하는 방법에 대해 포스팅해 보려한다. QueryDSL 설정, 사용방법, 문법에 대해 알고 싶다면 아래 링크를 통해 확인할 수 있다. 2023.07.10 - [오픈소스] - QueryDSL 기본 문법 총정리 2023.06.27 - [오픈소스] - [QueryDSL] 스프링부트 3.x 버전에서 QueryDSL 설정하기 2023.07.10 - [오픈소스] - QueryDSL 사용법, DTO 반환 방법 정리 동적 쿼리 querydsl에서 동적 쿼리를 사용하는 방법 중 Where 절에서 다중 파라미터를 사용하는 방법에 대해 설명하려 한다. 이 방법은 wher..

QueryDSL 기본 문법 총정리 [내부링크]

기본 문법들에 대해 설명하기 앞서 QueryDSL을 사용하기 위한 세팅 방법이나 사용방법들에 대해 알고 싶다면 아래의 포스팅들을 참고하면 된다. 2023.07.10 - [오픈소스] - QueryDSL 사용법, DTO 반환 방법 정리 2023.06.27 - [오픈소스] - [QueryDSL] 스프링부트 3.x 버전에서 QueryDSL 설정하기 QueryDSL 문법에 대해 설명하기 앞서 QueryDSL은 JPAQueryFactory를 사용하여 JPQL을 생성하고 실행한다. 작성하는 쿼리문을 보면 JPQL 문법이랑 동일하고, 뒤에 . 을 붙여 체인으로 연결하여 java 코드로 작성한다. // static import 방법으로 작성 import static study.querydsl.entity.QMember...

QueryDSL 사용법, DTO 반환 방법 정리 [내부링크]

스프링부트 3.x 버전에서 QueryDSL 설정하기 [QueryDSL] 스프링부트 3.x 버전에서 QueryDSL 설정하기 스프링 부트 2.x 버전 대를 쓰다가 이번에 스프링 부트 3.x 버전이 나오면서 많은 설정이 변경되었다. 이번 포스팅에서는 스프링부트 3.x 버전에서 QueryDSL을 설정하는 방법에 알아보고자 한다. (스 hstory0208.tistory.com 설명하기 앞서, QueryDSL을 사용하기 위해서는 JPAQueryFactory를 Bean 등록하고 의존성 주입받아야 한다. Bean 등록 @Configuration public class QueryDSLConfig { @Bean JPAQueryFactory jpaQueryFactory(EntityManager em) { return ne..

QueryDSL Repository 생성하기 (사용자 정의 리포지토리) [내부링크]

이번시간에는 QueryDSL을 사용하기위핸 QueryDSL 리포지토리를 만드는 방법에 대해 포스팅해보려고 한다. QueryDSL를 사용하기 위해서는 구현 클래스가 필요하고 Spring Data JPA는 인터페이스로 동작한다. 그래서 QueryDSL를 사용하기 위한 사용자 정의 리포지토리(Custom Repository)를 만들고 Spring Data JPA 리포지토리와 연결하는 방법을 알아보자. JPAQueryFactory 빈 등록 QueryDSL을 사용하기 위해서는 JPAQueryFactory를 다음과 같이 Bean 등록 해주어야 한다. @Configuration public class QueryDSLConfig { @Bean JPAQueryFactory jpaQueryFactory(EntityMana..

[Python/파이썬] 백준 13305번 - 주유소 [내부링크]

문제 설명 입출력 예제 풀이 코드 왼쪽에서 제일 오른쪽 도시로 이동하는 최소의 비용을 구하기 위해서는 가장 싼 주유소에서 기름을 넣는 것이 이득이다. 먼저 왼쪽에서 출발할 때는 기름이 없기 때문에 시작지점에서 먼저 기름을 넣고 시작하는데 가장 값이 싼 주유소를 찾기 위해 첫 번 째 주유소를 가장 값이 싼 주유소로 저장해 놓은 뒤 반복문을 통해 저장한 주유소와 현재 위치의 주유소의 기름 값을 비교해 가장 값이 싼 주유소를 갱신해서 기름을 넣으면 된다. 정답 코드 import sys input = sys.stdin.readline n = int(input()) distances = list(map(int, input().split())) oilCosts = list(map(int, input().split(..

[Spring] @ModelAttribute와 @RequestBody의 차이점에 대해 쉽게 이해해보자. (API 동작 방식) [내부링크]

@ModelAttribute와 @RequestBody 모두 HTTP 요청 파라미터를 객체에 매핑하는 데 사용되는 어노테이션입니다. api 개발을 하다가 이 두 개념에 대해 헷갈려서 확실히 정리하고 넘어가고자 포스팅하려 한다. @ModelAttribute @ModelAttribute는 요청 파라미터의 이름과 일치하는 객체의 필드에 요청 파라미터를 매핑한다. 쉽게 말해 폼 데이터를 객체에 매핑할 때 주로 사용하는 것이다. 아래 컨트롤러에 있는 코드를 통해 예시들을 보고 쉽게 이해해보자. requestDto 위 ItemSearchCond 객체를 살펴보면 다음과 같다. @Getter @NoArgsConstructor public class ItemSearchCond { private String itemName..

[Python/파이썬] 백준 2638번 - 치즈 [내부링크]

문제 설명 입력과 출력 및 예제 풀이 코드 2차원 배열의 값들을 하나씩 탐색해 해당 부분이 외부 공기와 2번 이상 접촉했는지 확인해야 하므로 BFS를 이용해 문제를 풀 수 있다. 내 코드에서 주의할점으로는 치즈가 있는 부분은 visited 방문 처리 하지 않았다는 점인데 여러 면에서 공기와 접촉이 될 수 도 있기 때문에 이 부분을 방문 처리 해버리게 되면 해당 치즈는 무조건 한 면만 접촉되는 것이 되기 때문이다. 나머지 부분은 주석을 통해 이해할 수 있을 것으로 생각되어 자세한 설명은 생략한다. 정답 코드 from collections import deque import sys input = sys.stdin.readline n, m = map(int, input().split()) cheeze = [l..

[Python/파이썬] 백준 1541 - 잃어버린 괄호 [내부링크]

문제 설명 입출력 예제 풀이 코드 그리디 알고리즘 문제로 괄호를 적절히 합쳐서 최소 값이 나올 수 있게 하는 방법만 알면 쉽게 해결할 수 있다. 해당 방법는 모든 + 식들만 먼저 더하고 나중에 구한 값들을 첫 번째 값에서 부터 빼는 방식이다. 이때, 첫 번째 값은 등호가 없으므로 따로 저장하여 처리한다. 만약 10 - 20 + 30 - 60 + 20 - 40 이 주어졌다고 가정해보자. 가장 최소 값이 나올 수 있도록 덧셈 식들만 괄호를 적용하면 다음과 같다. (10) - (20 + 30) - (60 + 20) - (40) 이 식대로 계산을 하면 정답은 10 - 50 - 80 - 40 = -160이 된다. 정답 코드 import sys input = sys.stdin.readline arr = input(..

[QueryDSL] 스프링부트 3.x 버전에서 QueryDSL 설정하기 [내부링크]

스프링 부트 2.x 버전 대를 쓰다가 이번에 스프링 부트 3.x 버전이 나오면서 많은 설정이 변경되었다. 이번 포스팅에서는 스프링부트 3.x 버전에서 QueryDSL을 설정하는 방법에 알아보고자 한다. (스프링 부트 3.x버전은 자바 17만을 지원하므로 자바 17이 준비되어 있어야한다.) QueryDSL을 적용하고 나면 Q타입 class라는 것이 생기는데 이 Q타입 class은 Entity 클래스를 통해 생성된다. 그리고 이 Q타입 class가 있어야 QueryDSL로 쿼리문을 작성할 수 있다. 그렇기 때문에 먼저 QueryDSL을 적용하기전에 Entity 객체가 준비되어 있어야한다. 나는 간단하게 Hello라는 엔티티 클래스를 만들었다. @Entity @Getter @NoArgsConstructor p..

[Spring Data JPA] 스프링 데이터 JPA에서 페이징(Paging) 사용하기 [내부링크]

저번 포스팅에서 순수 JPA를 통해 페이징을 적용하는 방법에 대해 알아보았다. Spring Data JPA를 사용하면 정말 편리하게 PageRequest를 따로 만들필요없이 페이징 적용이 가능하다. 하지만 Spring Data JPA도 Page와 Pageable 인터페이스를 사용하기 때문에 해당 인터페이스에 대한 설명은 아래 포스팅을 참고하는 걸 추천한다. [JPA] 페이징과 정렬에 대해 알아보자. 페이징 (Pageable, Page, Slice ) 데이터베이스의 대용량 데이터를 처리할 때, 데이터를 효율적으로 로드하고 출력하기 위해 페이지 단위로 데이터를 분할하여 가져오는 기능을 페이징이라고 한다. 페 hstory0208.tistory.com 페이징 적용 파라미터로 Pageable 인터페이스를 받고 다..

[Python/파이썬] 백준 16928 - 뱀과 사다리 게임 [내부링크]

문제 설명 입출력 예제 풀이 코드 10 x 10 크기의 보드판에서 진행되는 게임이라고 했지만 상하좌우로 움직이는게 아닌, 한 방향으로만 움직일 수 있다. 그렇기 대문에 2차원 배열이 아닌 1차원 배열로 나열해 풀 수 있다. 그리고 주어진 사다리, 뱀의 위치를 dict(딕셔너리) 타입으로 받아 주사위를 던져 도착한곳이 사다리, 뱀 위치(key)면 value로 이동시킨다. 정답 코드 from collections import deque import sys input = sys.stdin.readline n, m = map(int, input().split()) # 사다리 수, 뱀 수 board = [0] * 101 visited = [False] * 101 ladder = dict() for _ in ran..

Nginx란 무엇이고 왜 사용하는가? (Apache와 차이점) [내부링크]

Nginx의 등장 이전 최초의 웹 서버는 1995년 UNIX 기반으로 만들어진 NCSA Httpd 였다. 하지만 처음은 다 그렇듯이 NCSA Httpd에는 버그가 상당히 많아서 개발자들이 사용할 때 많은 불편함을 겪었다고 한다. 그래서 이러한 문제를 해결하기 위해 구조도 변경하고 새로운 기능을 추가해 개발된 것이 바로 Apache이다. Apache Apache는 요청이 들어오면 커넥션을 형성하기 위해 프로세스를 생성하는데 새로운 요청마다 프로세스를 생성하는 것은 시간이 소요되는 작업이다보니 프로세스를 미리 만들어 놓는 Prefork 방식을 사용했다. 새로운 요청이 들어오면 미리 만들어 놓은 프로세스를 가져다 쓰는 방식이다. 만약 만들어 놓은 프로세스가 모두 할당되었다면 추가로 프로세스를 만든다. 이러한 ..

왜 WAS와 Web Server를 같이 사용하는걸까? [내부링크]

Web과 WAS란 ? 웹 서비스의 구조에 대해 알아보자 Web Server (웹 서버) 웹 서버란, HTTP 프로토콜을 기반으로 동작하는 서버로, 동작하는 방식은 클라이언트가 웹 서버에 HTTP 요청을 보내면 웹 서버는 HTTP로 응답하여 정적 리소스를 제공합니다. 대표 hstory0208.tistory.com 보통 웹 서비스는 아래의 그림처럼 Client ↔ Web Server ↔ WAS ↔ DB 이런식으로 요청 , 응답을 주고 받는다. WAS만으로도 웹 서비스를 제공할 수 있는데 왜 앞에 Web 서버를 붙여 같이 사용하는걸까? 그 이유는 다음과 같다. 1. 성능 향상 웹 서버는 정적 콘텐츠(이미지, CSS, JavaScript 등)의 처리에 최적화되어 있다. 따라서 웹 서버가 정적 콘텐츠를 처리하고 ..

[Docker] 도커 컴포즈(Docker Compose)란? 왜 사용하는가? [내부링크]

도커 컴포즈란? 여러 개의 Docker 컨테이너들을 하나의 서비스로 정의하고 구성해 하나의 묶음으로 관리할 수 있는 하나의 애플리케이션을 만드는 것이다. 도커 컴포즈 설치 # 도커 컴포즈 V2 버전 설치 sudo curl -sSL "https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 실행 권한 설정 chmod +x /usr/local/bin/docker-compose # 버전 확인 docker-compose --version Docker Compose를 사용하기 위해선 다음과 같은 단계가 필요하다. Docker C..

[Docker] 도커 명령어 총모음집 (image, container, compose) [내부링크]

Docker 실행 sudo systemctl status docker # 1 sudo /etc/init.d/docker start # 2 Docker Image 관련 명령어 이미지 빌드 Dockerfile을 이용해서 이미지 생성 (제일 많이 쓰는 이미지 생성 방법) docker build -t {이미지명:태그명} {dockerfile의 경로} 이미지 삭제 도커 단일 이미지 삭제 docker image rm {이미지 ID 또는 이름} 모든 도커 이미지 삭제 (컨테이너가 있어서 이미지 삭제가 안될 시 -f 옵션을 붙여서 강제 삭제가능하다.) docker rmi {옵션} {이미지 ID 또는 이름} 이미지 조회 도커 이미지들 보기 docker images 현재 이미지 목록 확인 docker..

[Python/파이썬] 백준 1436 - 영화감독 숌 [내부링크]

문제 설명 입출력 예제 풀이 코드 이 문제는 완전탐색 탐색 문제로 완전 탐색 답게 무식하게 숫자를 하나씩 더해가면서 해당 숫자가 몇번째 종말의 수인지 찾아야 한다. 그래도 반복문을 덜 타게 규칙이 있지 않을까?했지만 그런 규칙을 찾긴 힘들었다 다만 반복문을 덜타도록 탐색하는 수 num을 1부터가 아닌 종말의 수인 "666"부터 시작하도록 하였다. 정답 코드 import sys input = sys.stdin.readline n = int(input()) cnt = 0 # 몇 번째 종말의 수인지 카운팅 num = 666 while True: if "666" in str(num): # 666이 num에 포함되어 있다면 cnt = cnt + 1 if cnt == n: # 구하자고 하는 n번째 종말의 수와 같다..

[Python/파이썬] 백준 11659 - 구간 합 구하기 4 [내부링크]

문제 설명 입출력 예제 풀이 코드 이 문제는 현대오토에버 코딩문제에 나온 문제라고 한다. 사실상 실버난이도인 만큼 접근만 한다면 쉽게 풀 수 있는 문제다. 제한 사항을 보면 N, M 입력값의 제한 범위가 100,000이다. 이중 반복문으로 풀면 쉽게 풀수는 있겠지만 2중 반복문은 O(n^2) 시간 복잡도를 갖기 때문에 시간초과가 발생한다. 따라서 O(N)이나 O(logN)의 시간 복잡도로 풀어야 하는데 문제에서도 이미 정답을 말해줬다."구간합" 문제를 푸는 방법은 다음과 같다. 주어진 값들의 누적합을 갖는 리스트를 만든다. PrefixSum 여기서 PrefixSum에 0을 넣어 놓은 이유는 주어지는 구간 i가 1부터 시작하기 때문에 인덱싱에러를 방지하기 위해서이다. 각 수들의 합을 갖는 변수 total을..

무중단 배포란? 무중단 배포 전략에 대해 알아보자. [내부링크]

무중단 배포란? 무중단 배포를 사용하지 않을 경우 실제 서비스를 서버 한대만을 사용해 운영한다고 가정해보자. 현재 서비스 중인 서비스는 application-V1을 배포한 서비스이다. 그런데 기능이 업데이트되어 application-V2를 새로 개발해 새로운 버전을 배포하려한다. 이 새로운 버전 V2를 배포하기 위해서는 V2 버전의 빌드 파일을 서버에 배포를 해야한다. V1과 V2는 서로 같은 포트를 사용하기 때문에 V2를 배포하기 위해서는 V1버전을 통해 실행하고 있는 서비스를 종료해야만한다. 이 경우 V1이 종료되고 V2 버전이 실행되는 사이 유저가 서비스를 이용할 수 없는 시간이 생기는데, 이를 "다운타임"이라고 한다. 무중단 배포 무중단 말 그대로 서비스가 중단되지 않은 상태로 새로운 버전을 배포..

[Docker] 도커의 레이어(Layer)에 대해 알아보자. [내부링크]

도커 이미지는 컨테이너를 만들기 위한 "압축파일" 개념이다. 이미지는 한번 만들어지면 이미지 내의 정보는 절대 변하지 않으며(불변성), 이미지를 통해 컨테이너를 만들 수 있다. 이 이미지는 컨테이너를 만들었다고 사라지지 않고, 하나의 이미지로 여러개의 컨테이너를 만들 수 도 있다. 이 이미지를 만들기 위해서는 dokckerfile 도커파일을 작성해야 한다. 도커 파일 작성방법은 아래 링크를 통해 확인할 수 있다. [Docker] dockerfile의 개념과 작성법에 대해 알아보자. hstory0208.tistory.com 도커 이미지는 컨테이너를 생성하기 위한 모든 정보를 갖고 있기 때문에 보통 수백MB ~ 수GB가 넘는다. (VM에 비해서는 상당히 작은 용량) 그런데 기존 이미지에서 작은 변경사항이 생..

[Docker] DockerFile의 개념과 작성법에 대해 알아보자. (도커 이미지 생성 방법) [내부링크]

DockerFile이란? Dockerfile은 Docker Image를 생성하기 위한 스크립트(설정파일)이다. 여러가지 명령어를 토대로 Dockerfile을 작성한 후 빌드하면 Docker는 Dockerfile에 나열된 명령문을 차례대로 수행하며 DockerImage를 생성한다. Dockerfile을 읽을 줄 안다는 것은 해당 이미지가 어떻게 구성되어 있는지 알 수 있다는 의미이기도 하다. 도커 파일은 레이어 개념으로 실행 되기때문에 레이어 순서대로 작성해주는게 좋다. DockerFile 작성법 기본적으로 도커 파일의 파일명은 확장자 없이 Dockerfile 이다. FROM 베이스 이미지를 지정. 생성할 이미지의 베이스가 될 이미지를 의미한다. 로컬에 해당 이미지가 없는 경우 Docker Hub에서 가져..

Docker(도커)란? 왜 사용하는가? [내부링크]

Docker란? Docker는 컨테이너 기반의 오픈 소스 가상화 플랫폼으로, 애플리케이션 및 그에 따른 환경을 격리된 컨테이너에 패키징하여 개발, 배포, 실행을 쉽게 지원하는 툴이다. 먼저 Docker를 이해하기 위해서는 가상화에 대해서 이해가 필요하다. 가상화란? 하이퍼바이저를 이용해 여러개의 운영체제를 하나의 호스트에서 생성하는 방식이다. 하이퍼바이저 하이퍼바이저는 다음과 같은 역할을 수행한다. OS들에게 자원을 나누어 주며 조율 OS들의 커널을 번역해서 하드웨어에게 전달 위 그림을 보면 하나의 Host OS에서 여러 개의 서버 운영 체제(게스트 OS)가 생성되어 있는 것을 볼 수 있다. 이렇게 생성된 게스트 OS들은 가상 머신이라는 단위로 구별되고, 다른 게스트 OS와는 완전히 독립된 공간과 시스템..

[Spring Data JPA] @EntityGraph 엔티티 그래프란? [내부링크]

Spring Data JPA는 JPA가 제공하는 엔티티 그래프 기능을 편리하게 사용하게 도와주는데, 이 기능이 바로 @EntityGraph이다. JPQL로 fetch join을 직접 작성하지 않고 @EntityGraph 어노테이션을 붙임으로서 fetch join을 편리하게 사용할 수 있다. 즉, @EntityGraph는 fetch join을 적용해주기 때문에 N + 1 문제를 해결하고, 성능 최적화에 도움을 줄 수 있다. (fetch join의 간편 버전) fetch join 이란? => 2023.06.12 - [JAVA/JPA] - [JPA] JPQL의 fetch join(패치 조인)이란? 사용 방법 Member와 Team 엔티티가 있고 이 둘은 "1 : 다" 양방향 관계를 갖는다고 가정해보자. 이 때..

[JPA] 페이징과 정렬에 대해 알아보자. [내부링크]

페이징 (Pageable, Page, Slice ) 데이터베이스의 대용량 데이터를 처리할 때, 데이터를 효율적으로 로드하고 출력하기 위해 페이지 단위로 데이터를 분할하여 가져오는 기능을 페이징이라고 한다. 페이징 적용 코드 다음과 같은 순서와 방식으로 페이징을 적용할 수 있다. public interface MemberRepository extends JpaRepository { Page findByAge(int age, Pageable pageable); } /** * 1. PageRequest 객체 생성 * PageRequest.of() 메소드를 사용하여 페이지 번호와 페이지 크기를 전달하며 PageRequest 객체를 생성할 수 있다. * 이때 정렬 조건이 있는 경우 추가적으로 Sort 객체도 함께..

[Spring Data JPA] 쿼리 생성 기능과 반환 타입 [내부링크]

메소드 이름으로 쿼리 생성 Spring Data JPA는 메서드 이름을 통해 쿼리를 작성해주는 쿼리 기능을 제공한다. (공식 문서 : Spring Data JPA - Reference Documentation) List findByUsernameAndAgeGreaterThan(String username, int age); 위 메서드 이름을 통해 실행도니느 쿼리는 다음과 같다. select m from Member m where m.username = :username and m.age > :age" 이 기능은 보통 파라미터 개수가 적을 때 사용한다. ( 파라미터 수가 많아지면 메서드 이름이 너무 길어져 가독성이 떨어짐 ) 그리고 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 꼭 함께 변경..

[JPA] 컬렉션 조회 시 주의할 점 (hibernate.default_batch_fetch_size) [내부링크]

DTO를 조회 하되, 그 안에도 엔티티가 있을 경우 DTO로 변환해서 사용해야한다. 아래 그림은 Order와 OrderItem 엔티티의 일부 코드로 "1 : 다" 양방향 관계를 갖고 있는 것을 볼 수 있다. 이 전 포스팅에서 엔티티를 직접 반환하면 안되는이유에 대해 알아봤었다. [Spirng/JPA] Dto와 Entity를 분리해서 사용하는 이유 프로젝트를 진행하거나 강의, 책을 보면 항상 엔티티를 직접 반환하지말고 DTO로 변환하여 반환하라는 말을 접하거나 보았을 것이다. 하지만 단순히 "아 ~ 그렇게 하라니까 그렇게 해야지" 보다 hstory0208.tistory.com 컬렉션도 마찬가지다. 컬렉션도 엔티티를 DTO로 변환해서 반환해야한다. Order와 OrderItem이 연관관계를 갖고 있는 것 처..

JpaRepository를 상속한 인터페이스가 구현체가 없이 동작하는 이유 [내부링크]

public interface MemberRepository extends JpaRepository { } Spring Data JPA를 사용하면 위 처럼 JpaRepository 인터페이스를 상속받은 인터페이스만 있어도 CRUD 기능을 다 지원한다. 그렇다면 어떻게 인터페이스의 구현체가 없는데도 MemberRepository가 작동하는 걸까? How ? JpaRepository 인터페이스를 상속 받은 MemberRepository 클래스 타입을 찍어보면 다음과 같이 나온다. memberRepository.getClass() => class com.sun.proxy.$ProxyXXX Spring Data JPA가 JpaRepository 인터페이스를 상속받은 인터페이스를 보고 구현체를 만들어서 의존성 주..

[Spring/JPA] OSIV 전략이란? 언제 사용해야 할까? [내부링크]

OSIV (Open Session In View) OSIV란 스프링 프레임워크에서 사용하는 세션 관리 전략 중 하나로 스프링 부트에서는 기본 값이 True로 설정되어 있다. spring.jpa.open-in-view: true 애플리케이션에서 HTTP 요청마다 새로운 데이터베이스 연결(Connection)이 생성되는데, 이에 따라 많은 수의 DB 커넥션이 발생하여 성능 저하가 발생할 수 있다. 하지만 OSIV 옵션을 True로 설정하여 사용하면, 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 장점 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 기본적으로 데이터베이스 커넥션을 유지한다. 지연 로..

[Spirng/JPA] Dto와 Entity를 분리해서 사용하는 이유 [내부링크]

프로젝트를 진행하거나 강의, 책을 보면 항상 엔티티를 직접 반환하지말고 DTO로 변환하여 반환하라는 말을 접하거나 보았을 것이다. 하지만 단순히 "아 ~ 그렇게 하라니까 그렇게 해야지" 보다는 "왜? 엔티티를 직접 사용하지 말고 DTO를 사용해야하는가"에 대해 정리해보려고 한다. DTO와 Entity 구분 DTO(Data Transfer Object) : 클라이언트와 서버 간 데이터 전송을 위해 설계된 객체 Entity : 데이터베이스에 저장되는 데이터 객체로, 데이터베이스와 직접적으로 연결 Enttity를 직접 반환할 경우 생기는 문제점 엔티티 구조 변경 시 발생하는 문제 예를 들어 요구사항이 변경되어 엔티티의 필드 이름이 변경 될 경우, API 스펙이 변경되어 추가 작업이 요구된다. 이는 효과적인 유..

[Spring] @Controller와 @RestController의 차이 및 구분 [내부링크]

이번 포스팅에서는 웹 애플리케이션을 API 방식으로 개발하는데, @Controller는 어디까지 구현하는데 사용하고 @RestController는 어디까지 구현하는데 사용해야 할지에 대해 확실히 정리하고자 한다. @Controller @Controller 어노테이션은 주로 웹 애플리케이션에서 View를 처리하는데 사용된다. Spring MVC에서 요청을 처리하고 뷰 템플릿과 연계하여 결과를 반환한다. 해당 뷰로 데이터를 전달하고 싶은 경우 Model 객체를 사용하여 데이터를 첨부해 반환할 수 있다. @Controller @RequiredArgsConstructor public class MemberController { private final MemberService memberService; @Get..

[티스토리] 게시글을 작성하는데 실패했습니다. (초간단 해결 방법) [내부링크]

요즘들어 갑자기 게시글을 작성할 때마다 "게시글을 작성하는데 실패했습니다." 라는 오류가 발생했다. 아마 실패 이유는 완료 버튼을 누르고 발행을 클릭하는데, 우측의 대표 이미지 사진이 로딩이 되지 않으면 해당 오류가 발생하는 것 같다. 해결방법 로딩이 되지 않은 이미지를 " - " 버튼을 클릭해 제거하고 다시 이미지를 등록하면 된다.

[JPA] @Modifying이란? 그리고 주의할점 (벌크 연산) [내부링크]

@Modifying 이란? Spring Data JPA에서 사용되는 애노테이션으로, @Query 어노테이션을 통해 작성된 변경이 일어나는 쿼리(INSERT, DELETE, UPDATE )를 실행할 때 사용된다. @Modifying을 변경이 일어나는 쿼리와 함께 사용해야 JPA에서 변경 감지와 관련된 처리를 생략하고 더 효율적인 실행이 가능하다. @Transactional @Modifying @Query("UPDATE User u SET u.name = :name WHERE u.id = :id") int updateUserName(@Param("id") Long id, @Param("name") String name); @Query, @Param 알아보기 (클릭) 벌크 연산 벌크 연산이란? 벌크 연..

[JPA] JPQL의 fetch join(패치 조인)이란? [내부링크]

Fetch Join JPQL에서 성능 최적화를 위해 제공하는 기능으로 연관된 엔티티나 컬렉션들을 한번의 SQL 쿼리로 함께 조회할 수 있다. 연관된 엔티티에 대해 추가적인 쿼리를 실행할 필요 없이 효율적인 로드를 할 수 있는 것이다. 즉, 패치 조인은 성능 최적화에 주로 사용되며, N+1 문제를 해결하는 데 효과적이다. 예를 들어 Order와 Product 엔티티가 있고, 이 둘이 (1 : N) 일대다 연관관계가 있다고 가정해보자. Order 엔티티를 조회하면서 관련된 상품(Product) 엔티티도 한 번의 쿼리로 함께 조회하기 위해 패치 조인을 사용할 수 있다. SELECT o FROM Order o JOIN FETCH o.products 위의 쿼리는 패치 조인을 사용하여 Order 엔티티와 관련된 P..

[JPA] 지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading) [내부링크]

JPA에서는 연관된 엔티티를 가져오는 방법으로 지연 로딩과 즉시 로딩이 있다. 지연 로딩 지연 로딩은 연관된 엔티티를 사용할 때까지 로딩을 지연하는 방식이다. 지연 로딩을 사용함으로써 연관 엔티티의 데이터를 사용할 필요가 없는 경우, 쿼리 수행과 시간을 절약할 수 있다. @xxToxx(fetch = fetchType.LAZY) 언제 지연로딩을 사용할까? 연관 엔티티를 많이 사용하지 않는 경우 부모 객체를 조회할 때 자식 객체를 따로 조회하지 않고, 자식 객체가 필요한 경우만 로드하여 사용할 때 유용하다. 실제로 필요한 경우에만 연관 엔티티를 사용하는 경우 연관 엔티티가 필요한 경우에만 로딩하여 불필요한 쿼리가 수행되지 않아, 쿼리 수행 시간을 줄일 수 있다. 대용량 데이터 처리 연관된 엔티티를 무조건 로..

[JPA] 사용자 정의 쿼리 작성과 파라미터 바인딩(@Query, @Param) [내부링크]

@Query Spring Data JPA를 사용할 때, 개발자가 원하는 쿼리를 직접 짜야 한다면, @Query 어노테이션을 사용하여 직접 쿼리를 작성할 수 있다. @Query 안에서 작성한 JPQL에 오타가 있다면 애플리케이션 실행 시점에 문법 오류를 발견할 수 있다. @Query는 JpaRepository를 상속하는 인터페이스에서 사용할 수 있다. public interface UserRepository extends JpaRepository { @Query("JPQL 쿼리작성") List method(); } 만약 나이가 18살 이상인 유저를 조회하는 쿼리를 작성해보면 다음과 같이 작성할 수 있다. public interface UserRepository extends JpaRepository { @..

[JPA] JPQL이란? 사용방법, 기본 문법 총 정리 [내부링크]

JPQL (Java Persistence Query Language)이란 ? JPQL은 엔티티 객체를 대상으로 하는 쿼리 언어이다. JPQL의 문법을 보면 다음과 같다. (나이가 18살 이상인 유저를 조회) select u from User as u where u.age > 18 JPQL은 SQL과 유사한 구문을 사용하는 것을 볼 수 있다. 하지만 살짝 다른 특징을 살펴보면 이렇다. JPQL 문법 특징 엔티티 클래스 이름, 엔티티 필드의 대소문자가 일치해야한다. ( 즉, 유저의 나이를 조회하는데 나이 필드가 age면 Age가 아닌 age로 작성 ) JPQL 키워드는 대소문자 구분하지 않는다. (SELECT, select, From, from) 엔티티 객체를 대상으로 하는 쿼리이므로 엔티티 이름을 사용한다..

[Python/파이썬] 백준 2589 - 보물섬 [내부링크]

문제 설명 입출력 예제 풀이 코드 처음에 육지중에 땅의 크기가 가장 큰 섬를 bfs로 구한다음에 가장 큰 섬에서 또 bfs로 보물 사이의 최단거리를 구해야하나? 라고 생각했다. 하지만 그럴 필요 없이 두 섬에서 보물 사이의 거리가 가장 먼 값을 구하면 된다. 정답 코드 from collections import deque import sys input = sys.stdin.readline r, c = map(int, input().split()) board = [list(input().rstrip()) for _ in range(r)] dx = [1, -1, 0, 0] dy = [0, 0, -1, 1] def bfs(x, y): q = deque() q.append((x, y)) visited = [[-..

[JPA] 임베디드 타입이란? (@Embeddable) [내부링크]

임베디드 타입은 엔티티의 일부에 별도의 클래스를 사용하여 구현함으로써, 코드를 더 모듈화하고 재사용성을 높이는 방식이다. 임베디드 타입을 사용함으로써 복잡한 속성 그룹을 분리하고 공통 타입을 다양한 엔티티에서 재사용할 수 있다. 이해하기 쉽게 예시를 통해 알아보자. 임베디드 타입을 사용하는 예시 User 엔티티에 다음과 같은 정보가 있다고 가정해보자. @Entity public class User { @Id @GeneratedValue private Long id; private String username; private String city; private String street; private String zipcode; ... } 여기서 city, street, zipcode는 주소에 해당된다...

[JPA] Entitiy에서 왜 Setter를 사용하지 말라고 할까? [내부링크]

어느 책에서나 어느 강의에서나 Entity에서는 Setter를 사용하는 것을 지양한다고 한다. 그렇다면 왜 setter를 지양할까 ? setter를 지양하는 이유 사용한 의도를 쉽게 파악하기 어렵다. Member member = new Member(); member.setUsername("김갑동"); member.setAge(50); 위 코드를 보면 member에 값을 설정하는 것은 알겠는데 이게 값을 생성하는 것인지, 값을 변경하는 것인이 의도를 파악하기 힘들다. 그리고 엔티티의 필드가 더 많을 수록 한눈에 파악하는 것이 힘들어진다. 일관성을 파괴한다. public Member updateMember(Long id) { Member member = findById(id); member.setUserna..

[Python/파이썬] 백준 2636 - 치즈 [내부링크]

문제 설명 입력과 출력 및 예제 풀이 코드 나름 정석적인 BFS 문제 풀이 방식으로 풀수 있는 문제였다. 이 문제를 풀기 위한 핵심은 다음과 같다. bfs 탐색으로 치즈를 녹여가면서 녹인 치즈의 개수를 구하고, 모두 녹기 한시간전의 녹인 치즈의 수를 알아야 하기 때문에 list에 저장해놓는다. 녹일수 있는 치즈의 수가 없을 때 까지 while 반복문을 돌며 다음 반복문이 돌기전에 time을 + 1 증가시킨다. 정답 코드 from collections import deque import sys input = sys.stdin.readline r, c = map(int, input().split()) board = [list(map(int, input().split())) for _ in range(r)] ..

[JPA] 영속성 전이(cascade)와 고아객체(orphalRemoval)란? [내부링크]

영속성 전이 영속성 전이는 부모 엔티티의 생명주기에 종속적인 자식 엔티티의 상태변화를 같이 처리해주는 역할을 한다. 즉, 부모 엔티티를 저장하거나 삭제 할 때, 자식 엔티티 역시 같이 저장하거나 삭제될 수 있도록 하는 것이다. 이를 통해 자식 엔티티를 추가적으로 저장, 삭제하기 위한 코드를 작성하지 않아도 된다는 장점이 있다. ( 연관관계를 매핑하는 것과는 아무 관련이 없다. ) 사용방법 영속성 전이는 @OneToOne, @OneToMany, @, @ManyToMany 관계에서 사용할 수 있으며, 사용하는 연관관계 매핑 옵션에 cascade = CascadeType.XXX 과 같은 옵션을 설정하여 사용할 수 있다. 주로 사용하는 옵션은 다음과 같다. CascadeType.ALL - 아래의 모든 Casca..

[JPA] 상속관계 매핑, 매핑 정보 상속에 대해 알아보자. [내부링크]

상속관계 매핑 - @Inheritance 관계형 DB는 상속 관계라는 개념이 없고, 슈퍼 타입, 서브 타입 관계라는 모델링 기법이 객체 상속과 유사하다. 그래서 JPA는 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑할 수 있는 상속 관계 매핑을 지원한다. JPA의 상속 관계 매핑은 총 3가지 방법이 존재한다. JOIN 전략 ( JOINED ) 단일 테이블 전략 ( SINGLE_TABLE ) 구현 클래스마다 테이블 전략 ( TABLE_PER_CLASS ) - 많은 단점이 존재해 추천 X 상속 관계 매핑에 사용되는 주요 어노테이션은 다음과 같다. @Inheritance(strategy=InheritanceType.??) 상속관계 매핑을 사용하는 주요 어노테이션으로 부모클래스에 해당 어노테이션을 붙..

[JPA] 연관관계 매핑 총 정리 [내부링크]

@ManyToOne - 다대일 ( N : 1) 연관관계 매핑 시 가장 많이 사용하는 매핑 방법이다. 다대일은 외래키(FK)를 갖고 있는 "다"쪽이 연관관계의 주인이 된다. 단방향 매핑 @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; ... } @Entity public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String nam..

[JPA] 연관관계 매핑 주인에 대해서 (mappedBy) [내부링크]

이번 포스팅에서 JPA의 연관관계 매핑의 주인이란 무엇인지? 또 연관관계 매핑의 주인이 왜 필요한지에 대해 알아보려한다. 연관관계 주인이 필요한 이유에 대해 먼저 말하자면, 객치 지향의 패러다임과 데이터베이스의 패러다임에 차이가 있기 때문이다. 먼저 각 패러다임의 차이를 이해할 수 있도록 양방향과 단방향 매핑에 대해 설명하고자 한다. 양방향과 단방향 매핑 양방향 : 두 객체 모두가 각각 참조용 필드를 갖고 참조 단방향 : 두 객체 사이에 하나의 객체만 참조용 필드를 갖고 참조 데이터베이스에서 양방향과 단방향 데이터베이스에는 양방향과 단방향이라는 개념이 없다. 외래키(FK) 하나면 양쪽의 연관관계를 알 수 있다. (양방향 관계의 특성을 갖는다.) 데이터 베이스 테이블은 외래키(FK) 하나로 양쪽 테이블을 ..

[Python/파이썬] 백준 5014 - 스타트링크 [내부링크]

문제 설명 풀이 코드 각 층마다 버튼을 몇번씩 눌려 도달했는지 저장하기 위해 visited[] 배열을 선언하였다. 강호의 위치(S)부터 bfs로 탐색을 시작한다. 강호의 위치(S)가 스타트링크(G)에 도착하면 스타트링크까지 도착하는데 눌린 버튼횟수를 반환한다. visited[cur] 정답 코드 from collections import deque import sys input = sys.stdin.readline f, s, g, u, d = map(int, input().split()) # 층수, 강호, 스타트링크, 위, 아래 visited = [-1] * (f + 1) def bfs(start): q = deque() q.append(start) visited[start] = 0 while q: cur..

[JPA] 기본 키 매핑 (기본키 자동 생성 전략) [내부링크]

기본키(primary key) 매핑하는 방법은 총 2가지로 직접 할당과 자동 생성이 있다. 직접 할당 : @Id 어노테이션만 사용하여 Id값을 직접할당 자동 생성 : @Id와 @GeneratiedValue를 사용하여 원하는 키 생성 전략을 선택 자동 생성의 키 생성 전략은 다음과 같이 4가지로 분류 된다. 키 생성 전략 IDENTITY : 데이터베이스에 위임 (MYSQL) SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용 (ORACLE) TABLE : 키 생성용 테이블 사용 (모든 DB에서 사용) AUTO : dialect(방언) 설정에 따라 자동 지정 (기본값) 이 각 키 생성 전략에 대해 자세히 알아보자. IDENTITY 전략 기본 키 생성을 데이터베이스에 위임하는 전략 (주로 MySQL, Pos..

[JPA] 엔티티 매핑 어노테이션과 속성 값 정리 [내부링크]

객체와 테이블 매핑 @Entity @Entity가 붙은 클래스를 엔티티라고 하고 JPA가 관리 한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수이다. 속성 값 속성 설명 기본값 name JPA에서 사용할 엔티티 이름을 지정한다 클래스 이름을 그대로 사용 주의할점 기본 생성자 필수이다. (파라미터가 없는 public 또는 protected 생성자) final, enum, interface, inner 클래스에서는 사용할 수 없다. 저장할 필드의 변수에 final을 사용할 수 없다. @Table 엔티티와 매핑할 테이블 지정한다. 속성 값 속성 설명 기본값 name 매핑할 테이블 이름을 지정한다 엔티티 이름 사용 catalog catalog 기능이 있는 DB에서 catalog를 매핑한다. ..

[JPA] 데이터베이스 초기화 전략 (ddl auto 옵션) [내부링크]

spring.jpa.hibernate.ddl-auto 데이터베이스 ddl 자동 생성 옵션으로 Entity 설정을 참고하여 애플리케이션 실행시점에 Hibernate에서 자동으로 DDL을 생성하여, 필요한 Database의 Table 설정들을 자동으로 수행해주는 기능이다. application.yml spring: jpa: hibernate: ddl-auto: 옵션 ddl-auto의 옵션으로는 5가지가 있다. ddl-auto 옵션 종류 create: 기존테이블 삭제 후 다시 생성 (DROP 후에 CREATE) create-drop: create와 같으나 종료시점에 테이블 DROP (테스트 코드 실행 시 주로 사용) update: 변경분만 반영, 추가만 반영되고 삭제는 반영되지 않는다. (DB Lock을 방지..

[JPA] dialect란? [내부링크]

JPA의 가장 큰 장점은 객체 매핑을 통해 자동으로 SQL 쿼리를 작성해 DB에 전달해준다. 그런데 DB의 종류는 한가지가 아닌 정말 다양한 DB의 벤더들이 있고 각 DB마다 SQL 문법이 다르다. 그럼 JPA는 어떻게 이 수많은 DB들에 우리가 사용하는 DB에 맞는 SQL을 작성하여 전달해줄까? 이 때 사용되는 것이 바로 "Dialect (방언)"이다. dialect는 JPA 구현체(ex: hibernate)가 사용하는 SQL 방언을 추상화한 것으로, 각 DB마다 다른 SQL 문법을 처리해준다. DB마다 맞은 SQL 언어를 JPA가 알아서 자동으로 인지하는 것이 아니라 다음과 같이 DB에 맞는 dialect를 설정해줘야한다. application.yml spring: jpa: properties: hi..

[데이터베이스] DDL, DML, DCL이란? [내부링크]

DDL(Data Definition Language) - 데이터 정의어 데이터베이스를 정의하는 언어이며, 데이터를 생성, 수정, 삭제하는 등의 데이터의 전체의 골격을 결정하는 역할을 한다. 쉽게 말해 데이터베이스의 테이블을 생성하고, 수정하고, 삭제하는 언어이다. create : 데이터베이스, 테이블등을 생성 alter : 테이블을 수정 drop : 데이터베이스, 테이블을 삭제 truncate : 테이블을 초기화 DML(Data Manipulation Language) - 데이터 조작어 정의된 데이터베이스에 입력된 레코드를 조회하거나 수정하거나 삭제하는 등의 역할을 한다. 쉽게 말해 DB 테이블의 컬럼과 로우를 조작하는 언어이다. 저장된 데이터를 실질적으로 처리하는데 사용된다. select : 데이터 조..

[Python/파이썬] 백준 1697번 - 숨바꼭질 [내부링크]

문제 설명 풀이 코드 숨바꼭질 3번 문제와 완전 똑같은데 순간이동시 시간이 1초 소요된다는 점만 다르다. [Python/파이썬] 백준 13549 - 숨바꼭질3 문제 설명 입출력 예제 풀이 코드 동생의 위치 k에 도달할 때 까지 문제에 주어진 3가지 이동방법으로 탐색한다. 문제에 주어진 범위 0 hstory0208.tistory.com 동생의 위치 k에 도달할 때 까지 문제에 주어진 3가지 이동방법으로 탐색한다. 문제에 주어진 범위 0

[Python/파이썬] 백준 16953 - A -> B [내부링크]

문제 설명 입출력 예제 풀이 코드 이 문제는 딱 보고 BFS 문제다라고 생각하진 못했지만 너비 우선 탐색 알고리즘 카테고리를 풀고 있기 때문에 BFS로 문제를 풀어 보았다. 큐에 연산을 통해 값이 변할 a와 첫 연산 횟수 1을 튜플로 묶어 추가해준다. 큐가 빌 때 까지 a의 뒤에 숫자 1을 추가한 수와 a * 2를 한 수를 추가하여 연산 횟수를 하나씩 올린다. 만약 a의 수가 b보다 크면 다음 큐를 꺼내어 확인한다. a와 b가 같다면 연산횟수 cnt를 출력하고 종료한다. 큐가 빌때 까지 a와 b가 같지 않다면 -1을 출력한다. 아래의 사진은 a : 2 , b : 162 일 때 bfs를 통해 나온 (a, cnt) 값들이다. 처음에는 a > b 일 때 continue를 하지 않아 정답과 다른 값이 나왔는데 ..

[JPA] 내부 동작 방식 (feat. 영속성 컨텍스트란?) [내부링크]

JPA를 사용하다보면 "영속성 컨텍스트"라는 단어를 많이 보게 된다. 하지만 대충 어떤방식인줄은 알지만, 정확히는 이해하지 못했다. 이번에 JPA에서 가장 중요하고 핵심 개념인 "영속성 컨텍스트"에 대해 다뤄보려한다. 영속성 컨텍스트 영속성 컨텍스트를 한국어로 번역하면 "엔티티를 영구 저장하는 환경"이라는 뜻이다. EntityManager.persist(entity) 우리가 Spring Data JPA를 사용할 때는 우리가 직접 EntityManager을 생성해서 객체를 저장하지는 않는다. 하지만 영속성 컨텍스트를 이해하기 위해서는 EntityManager에 대한 이해가 필요하다. EntityManager의 persist() 메서드는 객체를 저장하는 역할을 한다. 하지만 저장하는 곳이 DB가 아닌 바로,..

[Python/파이썬] 백준 13460 - 구슬 탈출2 [내부링크]

문제 설명 입출력 예제 풀이 코드 골드1 난이도인 만큼 이전 BFS문제보다 상당히 까다로웠다. 1. 먼저 빨강 공과 파란 공의 위치를 방문했는지 확인할 필요가 있다. 이 부분을 visited 리스트에 공들의 위치 값을 튜플로 넣어 방문 여부를 확인하였다. 2. 주어진 입력 값에서 빨강 공의 위치와 파란 공의 위치를 반환. getPos()라는 메서드를 만들어 각 공의 위치를 반환하도록 하였다. 3. 각 공이 구멍전까지 도달하는데 걸리는 기울이기 횟수를 구한다. move() 함수를 통해 이동하는 위치가 벽이아니고, 구멍에 들어가지 않을 동안 반복하여 각 공의 기울이기 횟수를 구하였다. 이 기울이기 횟수는 두 공의 위치가 겹쳤을 경우를 처리하기 위해 사용한다. 4. bfs를 통해 빨강 공이 구멍에 도달하면 r..

[Spring] 스프링 페이징(Paging) 기능 구현 방법 (Thymeleaf, JPA) [내부링크]

사용 기술 스택 - 스프링 부트 2.7.12 - 타임리프 - Spring Data JPA - H2 DB - Lombok 이번에 게시판에 필수요소인 페이징 기능을 추가해보았다. 페이징 기능은 Springframework가 제공하는 @PageableDefault 어노테이션, Pageable, Page 인터페이스로 구현할 수 있다. 이 포스팅은 페이징 기능을 구현하는 설명을 다루므로 페이징과 관계 없는 코드는 과감히 뺐으며, 나머지 부분은 아래 링크로 대체한다. - 게시판 웹 서비스에 관한 코드 : https://github.com/Hyeon0208/posting-webservice - OAuth로 소셜 로그인 구현 : 2023.05.30 - [JAVA/Spring] - [Spring] Google OAu..

[Spring] 스프링으로 파일 업로드, 다운로드 구현 (MultipartFile) [내부링크]

File -> Settings -> plugin 클릭 -> korean 검색 설치하고 인테리제이 재시작하면 정상적으로 한글화가 되어 있다. 초간단

IntelliJ 한글화 적용 방법 [내부링크]

File -> Settings -> plugin 클릭 -> korean 검색 설치하고 인테리제이 재시작하면 정상적으로 한글화가 되어 있다. 초간단

[IntelliJ] `Cannot resolve symbol` 에러 해결 방법 [내부링크]

예전에 만들었던 프로젝트를 열었더니 손하나 댄거 없었는데 아래처럼 모든 코드들이 시뻘게 져있다. 나는 인텔리제이 한글 플러그인을 다운로드 해서 해당 오류가 심볼 'springframework` 를 해결할 수 없습니다. 라고 나온다. ( 한글 플러그인 설치 방법 => 2023.05.31 - [JAVA] - IntelliJ 한글화 적용 방법 ) 해결 방법 프로젝트를 다시 빌드하거나 Gradle 종속성을 새로고침하는 여러 방법이 있지만 나는 이 방법보다는 "캐시 무효화"하는 방법이 가장 직빵이였다. 1. File -> Invalidate Caches를 클릭 2. Restart(무효화 및 다시 시작) 클릭 그럼 이제 캐시가 삭제되고 프로젝트가 다시 빌드 될 것이다. 빌드가 끝난다면 아래처럼 정상적으로 바뀐것을 ..

[Spring] Google OAuth 로그인 API 키 발급 및 구글 소셜 로그인 구현 [내부링크]

Google Cloud 프로젝트 생성 1. 먼저 아래의 주소로 들어간다. Google 클라우드 플랫폼 로그인 Google 클라우드 플랫폼으로 이동 accounts.google.com 빨간색 밑줄친 부분을 선택하고 -> 새 프로젝트 생성을 클릭한다. 프로젝트 이름을 적고 만들기를 클릭한다. OAuth2 동의 화면 OAuth 클라이언트 ID를 만들기 전에 먼저 동의 화면을 구성해야 한다. 자신이 생성한 프로젝트 이름이 맞는지 확인하고, API 및 서비스 -> 사용자 인증 정보를 클릭한다. 먼저 동의 화면을 구성해야한다. 우측의 동의 화면 구성을 클릭한다. 조직을 선택하지 않아 내부는 선택이 되지 않는다. 외부를 선택하고 만들기를 클릭하자. 앱 이름, 사용자 지원 이메일을 작성하고 다음으로 넘어간다. 다른 첨..

[Thymeleaf] 타임리프 header, footer 레이아웃 적용하기 (간단 버전) [내부링크]

레이아웃이란? 레아아웃을 사용하는 이유는 만약 100개의 페이지에 똑같은 header와 footer가 들어갈 경우 각각의 HTML마다 똑같은 header와 footer를 추가하는 것은 상당히 비효율적이고 유지보수면에서도 좋지 않다. 그래서 반복되는 화면이 있어 HTML 코드를 줄일 때 레이아웃을 적용하면 상당히 효과적이다. 타임리프 레이아웃 적용하기 의존성추가 레이아웃 기능을 사용하기 위해 아래의 의존성을 build.gradle에 추가하자. implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect' 폴더 구조 /layout/fragments/header.html 각 페이지마다 상단 부분에 반복적으로 들어가는 내용을 추가한다. 헤더입니다. /lay..

[Python/파이썬] 백준 16234 - 인구 이동 [내부링크]

문제 설명 입출력 예제 풀이 코드 더 이상 인구 이동이 일어나지 않을 동안 bfs 탐색을 통해 연합을 이루는 나라들을 구한다. 연합을 이루는 나라가 2개 이상이라면 연합인구수의 평균을 구해 인구이동을 시작한다. 인구 이동이 없다면 반복문을 종료하고 인구 이동이 발생한 횟수를 출력한다. 정답 코드 from collections import deque import sys input = sys.stdin.readline n, l, r = map(int, input().split()) country = [list(map(int, input().split())) for _ in range(n)] dx = [1, -1, 0, 0] dy = [0, 0, -1, 1] cnt = 0 def bfs(x, y): q = d..

[Vue.js] vue create 파일 로드 오류 (Window) [내부링크]

vue 프로젝트를 생성하기 위해 "vue create 프로젝트명"을 입력했는데 다음과 같은 오류가 발생했다. 이 시스템에서 스크립트를 실행할 수 없으므로 C:\Users\Home\AppData\Roaming\npm\vue.ps1 파일을 로드할 수 없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=135170)를 참조하십시오. 해결 방법 해당 오류는 Window의 PowerShell에서 악의적인 스크립트의 실행을 방지하기 위해 실행정책이 설정되어 있기 때문이다. 때문에 우리는 이 실행정책을 변경해주어야 vue create를 실행할 수 있다. 1. 먼저 관리자 권환으로 PowerShell을 실행한다. 2. 아래 명령어..

[Python/파이썬] 백준 1389 - 케인 베이컨의 6단계 법칙 [내부링크]

문제 설명 입력과 출력 입출력 예제 풀이 코드 아래 표 처럼 각 노드에서 출발하여 해당 노드와 연결된 노드까지의 거리를 구한 뒤, 총합이 가장 높은 노드를 출력하는 문제이다. 케빈 베이컨의 수 0 1 2 3 4 5 1번 노드 0 0 2 1 1 2 2번 노드 0 2 0 1 2 3 3번 노드 0 1 1 0 1 2 4번 노드 0 1 2 1 0 1 5번 노드 0 2 3 2 1 0 정답 코드 from collections import deque import sys input = sys.stdin.readline n, m = map(int, input().split()) # 유저 수, 친구관계 수 relationship = [[] for _ in range(n + 1)] for i in range(m): a, b ..

[Spring] 메트릭(matric) 직접 등록하기 [내부링크]

비즈니스 메트릭 CPU 사용량, 메모리 사용량, 톰캣 쓰레드, DB 커넥션 풀과 같이 공통으로 사용되는 기술적인 메트릭들은 이미 스프링 엑츄에이터에 등록되어 있기 때문에, 우리는 이러한 메트릭들을 가져와 대시보드를 구성하고 모니터링 하면 된다. 하지만 주문수, 취소수, 재고 수량 같은 비즈니스 메트릭 같은 비즈니스 메트릭들을 각각의 비즈니스에 특화되어 있기 때문에 각각을 직접 등록하고 확인해야 한다 비즈니스 메트릭의 예시로 취소수가 갑자기 급증하거나 재고 수량이 최대치를 넘는 부분은 기술적인 메트릭으로 확인할 수 없다. 거기에 더해 어떠한 문제가 생겨 주문 취소가 급격하게 증가한다해도 CPU, 메모리 사용량 같은 메트릭에는 아무런 문제가 발생하지 않아 문제를 인지하기 힘들다. 이 경우에 비즈니스 메트릭을..

[Grafana] 그라파나란? 대쉬보드 만들기 및 활용 [내부링크]

그라파나란? 프로메테우스가 DB라고 하면, 이 DB에 있는 데이터를 불러서 사용자가 보기 편하게 보여주는 대시보드가 필요하다. 그라파나는 매우 유연하고, 데이터를 그래프로 보여주는 툴이다. 수 많은 그래프를 제공하고, 프로메테우스를 포함한 다양한 데이터소스를 지원한다 대쉬보드 만들기 1. 그라파나의 주소로 접속한다. http://localhost:3000/dashboards 2. 왼쪽 상단의 삼선버튼을 클릭 후 Dashboards 카테고리를 클릭한다. 3. New를 클릭하고 New Dashboard를 클릭 4. 오른쪽 상단의 저장버튼을 눌려 대쉬보드의 이름을 적어 저장한다. 5. 생성한 대쉬보드에서 상단의 Add 버튼 클릭 후 Visualization을 클릭한다. 이 부분이 바로 매트릭(지표)를 그래프로..

[Python/파이썬] 백준 16236 - 아기 상어 [내부링크]

문제 설명 입출력 예제 풀이 코드 먼저 bfs()에서 탐색을 시작할 아기 상어의 자표를 먼저 구해야한다. 그렇게 하지 않고 while문 안에서 아기 상어의 좌표를 찾을 경우 n^3으로 시간초과가 발생한다. 핵심은 다음과 같다. bfs()에서 먹을 수 있는 물고기들을 반환하는데, 가장 거리가 가까운 물고리를 우선적으로 먹으므로 이를 거리순, x좌표순, y좌표순으로 반환한다. 그리고 while문을 통해 더이상 먹을 물고기가 없을 때 까지 반복문을 실행한다. 정답 코드 from collections import deque import sys input = sys.stdin.readline n = int(input()) sea = [list(map(int, input().split())) for _ in ran..

[Prometheus/Spring] 프로메테우스와 스프링 연결 [내부링크]

프로메테우스와 스프링 연결하기 애플리케이션 설정 스프링의 마이크로미터가 프로메테우스가 사용하는 포멧에 맞추어 메트릭을 만들어 준다. 각각의 메트릭들은 내부에서 마이크로미터 표준 방식으로 측정되고 있기 때문에 우리는 어떤 구현체를 사용할지 지정만 해주면 된다. build.gradle에 다음 내용 추가 마이크로미터 프로메테우스 구현 라이브러리를 추가하여 어떤 구현체를 사용할지 지정해준다. 이러면 스프링 부트와 액츄에이터가 자동으로 마이크로미터 프로메테우스 구현체를 등록해서 동작하도록 설정해준다. implementation 'org.springframework.boot:spring-boot-starter-actuator' // 엑츄에이터 implementation 'io.micrometer:micrometer..

[Spring] 마이크로미터(Micrometer)와 메트릭(Matric) 확인 [내부링크]

마이크로미터란? 서비스를 운영할 때는 애플리케이션의 CPU, 메모리, 커넥션 사용, 고객 요청수 같은 수 많은 지표들을 확인하는 것이 필요하다. 그래야 어디에 어떤 문제가 발생했는지 사전에 대응도 할 수 있고, 실제 문제가 발생해도 원인을 빠르게 파악해서 대처할 수 있다. 모니터링 툴은 시스템의 다양한 정보를 받아 우리가 모니터링할 수 있도록 도와준다. 모니터링 툴이 작동하려면 시스템의 다양한 지표들을 각각의 모니터링 툴에 맞도록 만들어서 보내주어야 하는데, 모니터링 툴마다 정해진 포멧방식이 다 다르다. 만약 기존에 사용하던 모니터링 툴에서 모니터링 툴을 변경하면 기존에 측정했던 코드를 모두 변경한 툴에 맞도록 다시 변경해야 하는 번거로움이 발생한다. 이런 문제를 해결하는 것이 바로 마이크로미터라(Mic..

[Spring] 스프링부트 엑츄에이터(Actuator)란? [내부링크]

엑츄에이터란? 서비스를 운영하면서 장애는 언제든지 발생할 수 있지만, 이 장애를 잘 대응하는 것이 중요하다. 서비스에 문제가 없는지 모니터링하고 지표들을 심어서 감시하여 장애에 대응할 수 있다. 운영 환경에서 서비스할 때 필요한 이런 기능들을 프로덕션 준비 기능이라 한다. 프로덕션 준비 기능을 통해 애플리케이션이 현재 살아있는지, 로그 정보는 정상 설정 되었는지, 커넥션 풀은 얼마나 사용되고 있는지 등을 확인하여 장애 발생에 미리 대응할 수 있어야 한다. 스프링 부트가 제공하는 액츄에이터는 이런 프로덕션 준비 기능을 매우 편리하게 사용할 수 있는 다양한 편의 기능들을 제공한다. 더 나아가서 마이크로미터, 프로메테우스, 그라파나 같은 최근 유행하는 모니터링 시스템과 매우 쉽게 연동할 수 있는 기능도 제공한..

[Grafana] 그라파나 - 프로메테우스 연동 방법 [내부링크]

그라파나는 프로메테우스를 통해서 데이터를 조회하고 보여주는 역할을 한다. 그렇기 때문에 먼저 프로메테우스가 실행되어 있어야 한다. 1. 그라파나 대쉬보드로 이동한다. http://localhost:3000 대쉬보드 왼쪽 삼선줄을 클릭하면 Connections항목이 보인다. 이것을 클릭한다. 2. Data sources 카테고리를 클릭후 Add Data source를 클릭한다. 3. 프로메테우스를 검색하여 클릭한다. 4. 그러면 다음과 같은 설정화면이 나오게 되는데 URL 부분에 프로메테우스의 주소인 http://localhost:9090을 입력한다. 그리고 맨 밑의하여 저장한다. 5. 맨 아래의 Save & test를 클릭하여 다음과 같은 문구가 나온다면 연동에 성공한 것이다.

[Grafana] 그라파나 설치 방법 (Window) [내부링크]

1. 아래의 링크로 접속해 그라파나 다운로드 페이지로 이동한다. Download Grafana | Grafana Labs Overview of how to download and install different versions of Grafana on different operating systems. grafana.com 2. 자신에게 맞는 운영체제를 클릭하여 다운로드한다. 3. 보안상 아래와 같은 문구가 뜰것이다. 추가 정보를 클릭한 뒤 실행을 클릭한다. 4. 실행이 된다면 그라파나 다운로드 exe가 실행되는데 next로 넘어간 뒤 install을 클릭하여 설치한다. 5. 이제 모든 설치가 완료되었다. 그라파나 서버 주소로 들어간다. http://localhost:3000 ID와 Password에 "..

[Prometheus] 프로메테우스란? 사용방법 [내부링크]

프로메테우스란? 애플리케이션에서 발생한 메트릭(지표)을 그 순간만 확인하는 것이 아니라 과거 이력까지 함께 확인하려면 메트릭을 보관하는 DB가 필요하다. 프로메테우스가 바로 이러한 메트릭을 지속해서 수집하고 저장하는 DB 역할을 담당한다. 프로메테우스의 기능 아래는 프로메테우스의 검색창에 http_server_requests_seconds_count (특정 URI의 HTTP 요청 수)를 입력해 실행한 결과이다. 보면 각 URL의 요청 마다 끝에 얼마의 요청이 왔는지 분리가 되어있다. 그리고 마이크로미터에서 메트릭 정보를 구분하는 태그를 프로메테우스에는 레이블(Lable)이라고 한다. 이 결과에서 해당하는 레이블을 보면 "error , exception , instance , job , method , o..

[Prometheus] 프로메테우스 설치하기 (Window 설치) [내부링크]

아래의 프로메테우스 다운로드 링크에 접속 Download | Prometheus An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach. prometheus.io 1. OS에 맞는 파일을 클릭하여 다운로드 받는다. (Mac은 drawin) 2. 다운로드 받은 압출 폴더를 압축 해제하고 해당 폴더에 들어가 prometheus.exe를 실행 3. 그러면 다음과 같은 화면이 나올 것이다. 추가 정보를 클릭 한뒤, 실행을 클릭한다. 4. 실행이되면 아래와 같은 cmd 창이 뜨게 된다. 5. 위의 cmd ..

[Python/파이썬] 백준 7562 - 나이트의 이동 [내부링크]

문제 설명 입출력 예제 풀이 코드 전형적인 bfs (너비 우선 탐색) 문제 이지만 딱 한가지 다른점이 있다. 바로 이동방향이다. 문제의 이동 방향을 보면 실제 체스의 나이트가 이동할 수 있는 것 처럼 대각선으로 2칸씩 8방향으로 움직인다. 나이트의 이동방향을 표현하면 다음과 같이 표현할 수 있다. 정답 코드 from collections import deque import sys input = sys.stdin.readline dx = [1, 1, 2, 2, -1, -1, -2, -2] dy = [-2, 2, -1, 1, -2, 2, -1, 1] def bfs(x, y): q = deque() q.append((x, y)) while q: x, y = q.popleft() if x == ex and y ..

[Spring] @Profile - 각 환경마다 서로 다른 빈 등록 [내부링크]

스프링에서 각 환경마다 서로 다른 설정 값을 사용하도록 "프로필" 기능을 지원한다. 그런데 설정 값 뿐만 아니라 각 환경마다 서로 다른 빈을 등록해야할 경우가 있을 수도 있다. 예를 들어서 결제 기능을 붙여야 하는데, 로컬 개발 환경에서는 실제 결제가 발생하면 문제가 되니 가짜 결제 기능이 있는 스프링 빈을 등록하고 운영 환경에서는 실제 결제 기능을 제공하는 스프링 빈을 등록한다고 가정해보자. @Profile 을 사용하여 아래처럼 등록되는 스프링 빈도 분리할 수 있다. @Slf4j @Configuration public class PayConfig { @Bean @Profile("default") // 기본값 프로필일 경우 이 빈이 등록 public LocalPayClient localPayClient(..

[Spring] @ConfigurationProperties 사용법 (설정 값 바인딩) [내부링크]

@ConfigurationProperties *.properties , *.yml 파일에 있는 property를 자바 클래스에 값을 가져와서(바인딩) 사용할 수 있게 해주는 어노테이션이다. ConfigurationProperties 장점 외부 설정을 객체로 편리하게 변환해서 사용할 수 있다. 외부 설정의 계층을 객체로 편리하게 표현할 수 있다. 외부 설정을 타입 안전하게 사용할 수 있다. (타입 오류시 컴파일 오류로 확인할 수 있음) (Bean Validation) 검증기를 적용할 수 있다. 사용법 *.properties, *.yml 파일의 설정 값을 @Value 을 사용하여 바인딩할 수 있다. 만약 application.properties의 설정 값이 다음과 같다면 my.test.url=test.db...

YAML이란? (JSON, XML과 비교) [내부링크]

XML과 JSON 기존에는 XML, JSON 파일 포맷으로 데이터를 저장하고 주고 받는데 했었다. 하지만 이 두 파일 포맷은 정해진 포맷 규칙 때문에 데이터가 많아진다면 작성하기가 번거롭고 읽기가 힘들다는 불편함이 있다. 다음은 같은 데이터를 XML과 JSON로 작성하여 비교해본 것 이다. 물론 JSON이 XML의 태그 문법같은 불편함을 해소하고자 나온 파일 포맷이라 XML보다는 좀더 편리하지만 그래도 열고 닫는 괄호 {}, []들로 인해 불편함이 있다. YAML이란? YAML은 XML과 JSON이 사용하기 복잡하고 불편함 점을 해결하기 위해 2001년 Clark Evans에 의해 최초 제안되었다. 원래는 "YAML Ain't Markup Language" "마크업 언어가 아니다" 라는 뜻으로 불렸으며 ..

[Spring] 스프링에서 YAML(application.yml) 설정 파일 사용 [내부링크]

YAML이란? YAML이란? (JSON, XML과 비교) XML과 JSON 기존에는 XML, JSON 파일 포맷으로 데이터를 저장하고 주고 받는데 했었다. 하지만 이 두 파일 포맷은 정해진 포맷 규칙 때문에 데이터가 많아진다면 작성하기가 번거롭고 읽기가 힘들다 hstory0208.tistory.com application.yml 스프링은 설정 데이터를 사용할 때 application.properties 뿐만 아니라 application.yml 이라는 형식도 지원한다. application.properties에 다음과 같은 옵션 설정이 있을 때 YAML로 변환하면 다음과 같다. 주의할점 application.properties , application.yml 을 같이 사용하면 application.prop..

[Python/파이썬] 백준 7569 - 토마토 [내부링크]

문제 설명 입출력 예제 풀이 코드 이 문제는 이전의 7576번 토마토 문제와 유사하지만 3차원 배열을 사용한다는 점이 다르다. [Python/파이썬] 백준 7576 - 토마토 문제 설명 입출력 예제 풀이 코드 처음에는 시작지점의 인덱스 값을 bfs(x, y) 이런식으로 넘겨 탐색하도록 했지만 "예제 입력3"번 케이스에서만 계속 전혀 다른값이 나왔다. 이유는 다음과 같았다 hstory0208.tistory.com 3차원 배열을 사용한다는 점과, 6방향(앞,뒤,상,하,좌,우)로 움직인다는 점에 유의하자 정답 코드 from collections import deque import sys input = sys.stdin.readline m, n, h = map(int, input().split()) # 열, 행..

[Python/파이썬] 백준 14502 연구소 - (BFS + 백트래킹) [내부링크]

문제 설명 입력과 출력 입출력 예제 풀이 코드 풀이 핵심 벽의 개수가 3개를 설치한 모든 2차원 배열(경우의 수)를 구한다. 3개의 벽이 설치된 2차원 배열마다 bfs()로 탐색하여 가장 큰 안전지대 개수로 갱신한다. 정답 코드 pypy3로 제출하여야 시간초과 없이 통과 from collections import deque import sys import copy input = sys.stdin.readline n, m = map(int, input().split()) # 행, 열 virus_map = [list(map(int, input().split())) for _ in range(n)] result = 0 dx = [1, -1, 0, 0] dy = [0, 0, -1, 1] # 백트래킹으로 3개의 ..

[Python/파이썬] 백준 7576 - 토마토 [내부링크]

문제 설명 입출력 예제 풀이 코드 처음에는 시작지점의 인덱스 값을 bfs(x, y) 이런식으로 넘겨 탐색하도록 했지만 "예제 입력3"번 케이스에서만 계속 전혀 다른값이 나왔다. 이유는 다음과 같았다. field[x][y]의 값이 1일 때 bfs(x,y)를 시작해 한칸씩 이동하는데, 예제 입력3번 케이스는 시작점이 2개이기 때문에 첫 번째 시작지점 탐색을 시작 할 때 field의 값을 +1씩 추가하고, 또 두번 째 시작지점에서도 bfs(x,y)를 시작해 field의 값을 +1 씩 추가하게 되어서 발생하는 문제였다. 이 부분을 해결하기 위해서는 queue의 특징을 이용해서 걍 시작점마다 한번씩 벌어가면서 탐색하도록 해야하는데 그러기 위해서는 시작점에 해당할 경우 먼저 queue에 시작점을 다 추가해놓고, 그..

[Spring] 배포 환경 별로 설정파일 분리하기 (프로필) [내부링크]

개발환경과 운영환경의 설정 분리 하나의 애플리케이션을 여러 다른 환경에서 사용해야 할 때가 있다. 예를 들어 개발환경과 운영환경이 필요할 경우 어플리케이션이 개발환경 DB에 접근하는 설정 정보와, 운영환경 DB에 접근하는 설정 정보가 다르다. 이를 해결 하기 위한 방법으로 하나의 내부 설정 파일 "application.properties"에서 스프링이 지원하는 "프로필"으로 각 환경 별 설정을 작성하여 관리 할 수 있다. application.properties spring.config.activate.on-profile=dev url=dev.db.com my_username=dev_user password=dev_pw #--- spring.config.activate.on-profile=prod url..

[Python/파이썬] 백준 1068 - 트리 [내부링크]

문제 설명 입력과 출력 입출력 예제 # 입력 5 -1 0 0 1 1 2 # 출력 2 풀이 코드 정답 코드 import sys input = sys.stdin.readline n = int(input()) tree = list(map(int, input().split())) delete = int(input()) def dfs(del_node): tree[del_node] = -10 # 의미없는 숫자를 부여해 제거함을 의미 for i in range(n): if del_node == tree[i]: # tree[i]가 del_node의 자식이면 재귀를 통해 삭제 dfs(i) dfs(delete) cnt = 0 for i in range(n): if tree[i] != -10 and i not in tree..

[Spring] 스프링 AOP 주의사항 - 프록시 내부호출 [내부링크]

스프링은 프록시 방식의 AOP를 사용합니다. 스프링 AOP를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록하고, 스프링은 의존관계 주입시에 항상 프록시 객체를 주입합니다. 프록시 객체가 주입되기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생하지 않지만 대상 객체의 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생하게 됩니다. 어떤 문제가 발생하는지 간단한 예시를 통해 알아보겠습니다. CallService에서 external() 메서드를 호출하는데 그 안에서 CallService 자기 자신의 메서드인 internal()을 호출하는 상황 package hello.aop.internalcall.aop; ... @Slf4j @Componen..

[Spring] 특정상황에 스프링 AOP 적용하기 [내부링크]

Spring AOP를 이용하여 특정상황에 AOP를 적용할 수 있습니다. 이번 포스팅에서 설명할 내용은 다음과 같습니다. ---------------------------------------------------------- 직접 만든 @Trace 어노테이션이 붙은 메소드에 AOP 적용하기 예외가 발생했을 경우 재시도를 하는 AOP 적용하기 메소드의 실행시간이 일정 시간을 초과했을 경우 AOP 적용하기 @Trace 어노테이션이 붙은 메소드에 AOP 적용 먼저 직접 만든 @Trace 어노테이션이 붙은 메소드에 AOP 적용하는 방법을 알아 보겠습니다. 1. @Trace 어노테이션을 생성합니다. @Trace 어노테이션 package hello.aop.exam.annotation; ... @Target(Elem..

[Python/파이썬] 백준 1167 - 트리의 지름 (DFS / BFS) [내부링크]

문제 설명 입출력 예제 # 입력 5 1 3 2 -1 2 4 4 -1 3 1 2 4 3 -1 4 2 4 3 3 5 6 -1 5 4 6 -1 # 출력 11 풀이 코드 이전 포스팅한 백준 1967 트리의 지름 문제와 별 차이가 없습니다. 주어진 입력값으로 그래프를 초기화하는 방법만 다를 뿐입니다. 트리의 지름을 구하는 방법은 다음과 같습니다. 1. 시작 정점에서 임의의 정점까지의 거리를 구하여 가장 먼 거리를 구합니다. 2. 1에서 찾은 가장 먼 거리를 시작 지점으로 하여 다시 한번 가장 긴 거리를 찾습니다. 정답 코드 (DFS) import sys input = sys.stdin.readline sys.setrecursionlimit(10 ** 9) V = int(input()) graph = [[] for..

[Spring] 스프링 AOP - Pointcut 표현식 [내부링크]

AspectJ는 포인트컷을 편리하게 표현하기 위한 특별한 표현식을 제공합니다. 스프링에서는 포인트컷 표현식에서 사용하기 위해 AspectJ가 제공하는 포인트컷 지시자(Pointcut Designator) 줄여서 PCD를 지원합니다. 포인트컷 지시자의 종류 포인트컷 지시자는 아래와 같이 여러개가 있지만, 주로 execution을 자주 사용합니다. execution : 메소드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다. within : 특정 타입 내의 조인 포인트를 매칭한다. args : 인자가 주어진 타입의 인스턴스인 조인 포인트 this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 target : Target 객체(스프링 AOP 프록시..

[Spring] 스프링 AOP (@Aspect) 사용법 [내부링크]

스프링 AOP 적용법 스프링 AOP를 사용하기 위해서는 build.gradle에 아래의 라이브러리를 의존성 추가해줘야합니다. implementation 'org.springframework.boot:spring-boot-starter-aop' // aop 추가 스프링 AOP를 적용하기 위해서는 @Aspect 어노테이션을 사용합니다. @Slf4j @Aspect @Component public class AspectExample @Around("execution(* hello.aop.test..*(..))") // AspectJ 표현식 public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPo..

[Spring] 스프링 AOP(Aspect Oriented Programming)란? - @Aspect [내부링크]

AOP를 사용하지 않는다면 ? AOP에 대해 설명하기 전에 AOP를 사용하는 이유에 대해 먼저 알아 봅시다. 애플리케이션 로직은 크게 핵심 기능과 부가 기능으로 나눌 수 있습니다. 핵심 기능 : 해당 객체가 제공하는 고유의 기능 부가 기능 : 핵심 기능을 보조하기 위해 제공되는 기능 ( ex: 로그 추적 기능, 트랜잭션 기능 ) 보통 기존 프로젝트에 부가 기능을 추가하게 되면 하나의 클래스가 아닌 여러 클래스에 부가 기능을 추가하게 됩니다. 예를 들어서 프로젝트의 모든 클래스에 로그 기능을 추가 한다면 하나의 부가 기능(로그 추적)을 여러 곳에 동일하게 사용하게 됩니다. 이러한 부가 기능을 바로 횡단 관심사(cross-cutting concerns) 라고 합니다. 부가 기능 적용시 문제점 그런데 이러한 ..

[Spring] 프록시 패턴과 데코레이터 패턴 [내부링크]

프록시란 ? 우리가 일반적으로 클라이언트가 서버를 호출할 때는 아래와 같은 그림을 떠올립니다. 직접 호출의 경우에는 클라이언트가 서버를 직접 호출하고, 그 결과를 받습니다. 그런데 클라이언트가 요청한 결과를 서버에 직접 요청하는 것이 아닌 "대리자"를 통해 대신 간접적으로 서버에 요청을 할 수도 있습니다. 여기서 "대리자"의 역할을 하는 것은 프록시(Proxy)로, 클라이언트는 프록시를 통해 간접적으로 서버에 요청합니다. 이렇게만 보면 굳이 프록시를 중간에 둬서 요청을 해야하나 ? 라는 생각이 들 수 있는데 프록시를 중간에 둘 경우 여러 기능을 추가로 얻을 수 있습니다. 프록시의 주요 기능 접근 제어 권한에 따른 접근 차단 캐싱 지연 로딩 - 접근 제어의 캐싱 예시 철수가 메로나가 먹고 싶어 형한테 올 ..

[intellij] finished with non-zero exit value 1 오류 [내부링크]

인텔리제이 실행 시 다음과 같은 오류를 만났습니다. 이 오류는 인텔리제이의 "빌드 및 실행" 환경의 설정이 Gradle로 되어 있을 시 위와 같은 오류가 발생한다고 합니다. 해결 방법은 아주 간단합니다. "빌드 및 실행"환경 설정을 IntelliJ IDEA로 변경해줍시다. 해결 방법 경로 : 파일 -> 설정 -> 빌드, 실행, 배포 -> 빌드 도구 -> Gradle

[Java/자바] 프로그래머스 Lv2 - 조이스틱 (Greedy/탐욕법) [내부링크]

문제 설명 Solution.java 정답 코드 class Solution { public int solution(String name) { int answer = 0; // 조이스틱 조작 횟수 int len = name.length(); int move = name.length() - 1; // 기본 최소 좌우이동 횟수 (좌, 우 커서) // 해당 커서 알파벳 변경 최솟값 (위, 아래 커서) for (int i = 0; i < len; i++) { answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1); // 연속된 'A'가 끝나는 지점 찾기 int next = i + 1; while(next < len && name.charAt(next)..

IntelliJ (인텔리제이) Window 유용 단축키 모음 [내부링크]

ctrl + O 오버라이딩 메서드 생성 alt + insert 생성자 및 여러 컨트롤 자동 생성 ctrl + alt + v 해당 메서드에 대한 반환 타입과 변수 자동 작성 ctrl + shift + T 해당 클래스의 경로와 똑같고 클래스이름 끝에 Test가 붙은 테스트 코드 생성 ctrl + alt + M 해당 부분 메서드 추출 ctrl + shift + Enter ; 자동 입력 작성중인 코드에; 를 붙여서 완성 후 다음 줄 ctrl + p 해당 메서드 파라미터 정보 보기 ctrl + e 최근 이용 파일 보기 ctrl + e 후에 enter를 입력하면 이전 파일로 이동 ctrl + alt + T 다음으로 둘러싸기. shift + F6 변수명 전체 변경. shift + F10 이전 실행 파일 재실행 F2 ..

[Spring] 동시성 문제와 해결 (쓰레드 로컬) [내부링크]

동시성이란? 여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제를 동시성 문제라고 합니다. 이런 동시성 문제는 여러 쓰레드가 같은 인스턴스의 필드에 접근해야 하기 때문에 트래픽이 많을 때 자주 발생하게 됩니다. 특히 자바의 스프링은 기본적으로 스프링 빈을 싱글톤으로 등록하기 때문에 싱글톤 객체의 필드를 변경하며 사용할 때 이러한 동시성 문제를 조심해야 합니다. ( 동시성 문제는 값을 읽기만 하면 발생하지 않고, 값을 변경하기 때문에 발생 ) 동시성 문제는 쓰레드마다 각각 다른 메모리 영역이 할당 지역 변수에서는 발생하지 않고, 동시성 문제가 주로 발생하는 곳은 같은 인스턴스의 필드(주로 싱글톤에서 자주 발생) 접근, 또는 static 같은 공용 필드에 접근할 때 발생합니다. 동시성 ..

[Spring] DAO, DTO, VO란? 각각의 개념에 대해 알아보자. [내부링크]

DAO(Data Transfer Object) "실제로 DB의 데이터에 접근하는 객체" DAO는 Service와 DB를 연결하는 역할을 하며, 실제로 DB에 접근하여 data를 삽입, 삭제, 조회, 수정 등 CRUD 기능을 수행합니다. JPA에서는 DB에 데이터를 CRUD 하는 JpaRepository를 상속받는 Repository 객체들이 DAO라고 볼 수 있습니다. public interface itemRepository extends JpaRepository { } DTO(Data Access Object) "계층 간 데이터 교환을 위한 객체" 로직을 가지지 않고 getter/setter 메소드만 가진 순수한 데이터 객체 클래스(Java Beans)로 DB에서 데이터를 얻어 Service나 Cont..

[Spring] 스프링 인터셉터(Interceptor) [내부링크]

스프링 인터셉터(Interceptor)란? interceptor는 위 처럼 가로챈다는 뜻을 갖습니다. 즉, 스프링 interceptor란 요청을 가로채서 개발자가 원하는 동작을 추가하는 역할을 합니다. 왜 interceptor를 사용해야하는 가? 스프링 interceptor는 웹과 관련된 공통 관심사를 해결하기 위한 기술로 대표적으로 공통 로그 처리, 권한 체크에 사용될 수 있습니다. 권한 체크를 예를 들면, 로그인을 해야 이용할 수 있는 페이지는 비로그인 사용자가 이용할 수 없어야 합니다. interceptor를 이용해 요청을 받아 들이기 전, 세션에서 로그인한 사용자가 있는지 확인해보고 없다면 로그인 페이지로 redirect 시킬 수 있습니다. 스프링 인터셉터 구현하기 (HandlerIntercept..

[Spring] 스프링에서 API 예외(오류) 처리하기 (@ExceptionHandler, @ControllerAdvice) [내부링크]

@ExceptionHandler 스프링은 API 예외 처리 문제를 해결하기 위해 @ExceptionHandler 라는 애노테이션을 사용하는 매우 편리한 예외 처리 기능을 제공합니다. 사용방법은, 잡을 예외를 파라미터로 갖는 메서드를 만들고 메서드 위에 @ExceptionHandler 애노테이션을 선언하여 사용합니다. 해당 컨트롤러에서 처리하고 싶은 예외를 지정해주면 해당 컨트롤러에서 예외가 발생할 경우 이 메서드가 호출됩니다. (발생한 예외를 잡으면 지정한 예외 또는 그 예외의 자식 클래스는 모두 잡습니다.) 에러 코드와 메세지를 갖는 객체 오류가 발생하면 단순하게 오류 코드와 메시지를 JSON 데이터로 보내는 단순한 구조를 갖는 예제로 설명하겠습니다. @Data @AllArgsConstructor pu..

[Spring] 스프링 부트 - 요청 타입변환(Converter), 포맷터(Formatter) [내부링크]

스프링 타입 컨버터(Converter) 웹 개발을 하다보면 문자를 숫자로 변환하거나, 숫자를 문자로 변환해야 하는 일이 상당히 많습니다. 특히, HTTP 요청 파라미터는 모두 문자로 처리되기 때문에 요청 파라미터를 자바에서 다른 타입으로 변환해서 사용하고 싶으면 다음과 같이 숫자 타입으로 변환하는 과정을 거쳐야 합니다. 그런데! 스프링의 요청 파라미터인 @RequestParam , @ModelAttribute , @PathVariable 어노테이션을 사용하면 스프링이 중간에 해당 요청 파라미터의 반환 타입을을 보고, 타입 변환기를 사용해서 타입을 변환해줍니다. public String hello(@RequestParam Integer data) { ... } (@RequestParam 요청 파라미터의 반..

[Spring] 스프링에서 HTML 오류 페이지 처리하기 [내부링크]

정적 오류 페이지를 보여주고 싶다면, resources/static 동적 오류 페이지를 보여주고 싶다면, 뷰 템플릿 경로인 resources/templates 둘 중 자기가 보여주고자 하는 경로에 /error 폴더를 만들어 이 error 폴더에 발생하는 HTTP 상태 코드 이름의 HTML파일을 만들어서 넣어두기만 하면 됩니다. 5xx, 4xx는 500번 대, 400번 대 오류를 처리 해주며, 구체적인 오류코드 (ex: 404, 500)이 있다면 이 구체적인 오류코드 이름의 페이지가 우선순위가 더 높습니다. Controller @Controller public class ErrorPageTestController { @GetMapping("/error-ex") public void errorEx() { t..

[Spring] @Transactional 옵션 알아보기 + 트랜잭션 전파 [내부링크]

@Transactional에 대해 궁금하다면 아래 포스팅을 읽어보는 것을 추천드립니다. 트랜잭션이란? 특징과 사용법에 대해 쉽게 알아보자 트랜잭션(Transaction) 트랜잭션은 DB의 상태를 변경시키기 위해 수행하는 작업 단위입니다. 여기서 DB의 상태를 변경시킨다는 SELECT, UPDATE, INSERT, DELETE 와 같은 쿼리를 날려 연산을 수행하는 것입니 hstory0208.tistory.com 트랜잭션 전파 트랜잭션을 각각 사용하는 것이 아니라, 트랜잭션이 이미 진행중인데, 여기에 추가로 트랜잭션을 진행 시킬 수 있습니다. 이런 경우 어떻게 동작할지 결정하는 것을 트랜잭션 전파(propagation)라 합니다. 트랜잭션이 하나일 경우 먼저 트랜잭션이 하나 있을 경우를 봅시다. 트랜잭션 처..

체크 예외(Exception)와 언체크 예외(RuntimeException) [내부링크]

자바 예외에 대해 예외 설 명 Object 예외도 객체다. 모든 객체의 최상위 부모는 Object 이므로 예외의 최상위 부모도 Object 이다. Throwable 최상위 예외. Throwable 하위에 Exception 과 Error 가 있다. Error 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외 (언체크 예외) 이미 처리가 불가능한 오류 이므로 이 오류를 잡으려 해서는 안된다. Exception 체크 예외 애플리케이션 로직에서 사용할 수 있는 실질적인 최상위 예외 Exception 과 그 하위 예외는 모두 컴파일러가 체크하는 체크 예외 RuntimeException 런타임 예외 컴파일러가 체크 하지 않는 언체크 예외 RuntimeException 과 그 자식..

[Spring] 트랜잭션 AOP 주의 사항 [내부링크]

프록시 방식의 AOP 한계 @Transactional 어노테이션을 사용하는 트랜잭션 AOP는 프록시를 사용하는데 이 프록시를 사용하면 메서드 내부 호출에 프록시를 적용할 수 없는 한계를 갖습니다. 어떠한 한계가 생기는지 자세히 알아보기 위해 먼저 스프링 컨테이너에서 트랜잭션 프록시가 등록되는 것을 그림으로 봅시다. 스프링 컨테이너에 트랜잭션 프록시 등록 @Transactional 애노테이션이 특정 클래스나 메서드에 하나라도 있으면 있으면 트랜잭션 AOP는 위 그림처럼 프록시를 만들어서 스프링 컨테이너에 등록합니다. 이 때, 실제 TxService 객체 대신에 프록시인 TxService$$CGLIB 를 스프링 빈에 등록합니다. 그리고 프록시는 내부에 실제 TxService 를 참조합니다. 여기서 핵심은 실..

SQL 예약어 매핑 오류 (SQL Error: 42001, SQLState: 42001) [내부링크]

@Entity @Getter @Setter public class Order { @Id @GeneratedValue private Long id; @Column private String username; @Column private String payStatus; } Order라는 Entity 객체를 매핑하여 테스트를 돌렸을 시 아래와 같은 오류가 발생했습니다. 알아보니 이러한 오류가 발생한 문제는 다음과 같습니다. 오류 원인 Hibernate 는 JPA 엔티티 클래스를 보고 데이터베이스 테이블을 자동 생성해 줍니다. 만약 엔티티 클래스의 이름이 Item 이라면 Item이라는 테이블을 생성해줍니다. 그런데 여기서 문제가 있습니다. 데이터베이스 키워드/예약어(ORDER, GROUP, SELECT, WHE..

프레임워크? 라이브러리? 쉽게 이해하기 [내부링크]

프레임워크(Framwork) 이미 완성되어 있는 뼈대, 틀을 의미하며, 우리는 제공된 틀안에서 주어진 규칙을 지켜가며 사용합니다. 쉽게 예를 들면 우리가 성공해서 건물을 하나 올린다고 생각해봅시다. 건물으 세운다면 그저 우리가 원하는데로 막 지울 수 있는 것이 아니라 나라에서 정한 건축법에 따라 그 규칙에 맞게 지을 수 있습니다. Java의 Spring에서 규칙 하나를 예를 들면 정적 리소스는 resources/static 폴더에, 동적 리소스는 resources/template 폴더에 담는 규칙이 있죠. 우리는 이미 완성되어 있는 프레임워크를 정해진 규칙에 맞게 사용하여 필요한 기능을 직접 구현할 필요 없이 원하는 기능을 구현하는데 더 집중할 수 있습니다. 프레임워크 예 Java 서버 개발에 사용되는 ..

[JPA] QueryDSL이란? 그리고 설정 방법 [내부링크]

QueryDSL이란 ? SQL, JPQL 등을 코드로 작성할 수 있도록 해주는 프레임워크로 쿼리를 type-safe(컴파일시 에러 체크 가능)하게 Java 코드로 작성할 수 있습니다. QueryDSL은 동적 쿼리를 아주 편리하게 작성할 수 있어 복잡한 동적 쿼리를 사용해야 할 때 QueryDSL을 사용하고 단순한 경우에는 Spring Data JPA를 사용합니다. QueryDSL은 JPA가 제공하는 JPQL을 코드로 작성할 수 있도록 도와주는 빌더 역할을 하기 때문에 JPQL의 문법에 대한 이해가 필요합니다. SQL과 JPQL의 문제점 QueryDSL을 이해하기 전에 먼저 SQL과 JPQL의 문제점을 알아봅시다. # SQL String sql = "select id, item_name, price, qu..

[Python/파이썬] 프로그래머스 Lv2 - 우박수열 정적분 [내부링크]

문제 설명 제한사항 입출력 예 Solution.py 초항 K가 5일 때 콜라츠 추측으로 계산하면 다음과 같은 수열이 나옵니다. [5, 16, 8, 4, 2, 1] 나온 수열 대로 그래프를 그려보면 아래와 같은 그림이 나옵니다. 여기서 각 꼭지점마다 선을 그어서 사다리꼴 사각형을 만들 수 있습니다. 여기서 기억나지 않는 사람들 위해 사다리꼴 사각형이란 무엇인지에 대해 설명하자면 평행한 변이 있는 사각형, 즉 마주 보는 한 쌍의 변이 서로 평행한 사각형을사다리꼴이라고 합니다. 이제 문제의 답을 구하기 위한 각 구간의 넓이를 구해야하는데 그림을 보면 사다리꼴 넓이로 구간의 넓이를 구할 수 있어 보입니다. 각 사다리골 사각형들의 넓이를 구해 구간의 넓이를 구해 봅시다. 사다리꼴 넓이는 ((윗변+아랫변) * 높이..

[JPA] JPA란 ? 그리고 Spring Data JPA [내부링크]

JPA(Java Persistent API)란 ? ORM (Object Relational Mapping) 객체 관계 매핑 기술의 표준으로 인터페이스의 모음입니다. 따라서 실제로 동작하는 것이 아니기 때문에 구현체가 필요한데, JPA 표준을 구현한 구현체는 아래와 같이 Hibernate, EclipseLink, DataNucleus가 있으며 대표적으로 Hibernate를 사용합니다. ORM 이란 ? ORM 기술은 말 그대로 객체와 관계형 데이터 베이스를 매핑해 주는 기술으로 객체는 객체대로 설계할 수 있고 관계형 데이터베이스는 관계형 데이터베이스대로 설계가 가능하도록 ORM 프레임워크가 중간에서 매핑을 해줍니다. JPA의 동작 과정 JPA는 JAVA 애플리케이션과 JDBC 사이에서 동작하는데 JAVA 애..

[Python/파이썬] 프로그래머스 Lv1 - 바탕화면 정리 [내부링크]

문제 설명 제한사항 입출력 예 Solution.py 정답률이 낮은 문제이지만 생각보다 간단하게 풀 수 있습니다. 입출력 예제 2번 그림을 통해 설명해보겠습니다. 1. 첫 행부터 ~ 마지막 행에 있는 파일 중에 제일 처음 파일이 있는 행과 마지막에 파일이 있는 행을 찾아봅시다. 그러면 다음과 같이 표시 됩니다. 2. 첫 열부터 ~ 마지막 열에 있는 파일 중에 제일 처음 파일이 있는 열과 마지막에 파일이 있는 열을 찾아봅시다. 그러면 다음과 같이 표시 됩니다. 3. 표시된 파일을 사각형의 경계로 하여 사각형을 그려봅니다. 그러면 사각형은 다음과 같이 그릴 수 있습니다. 4. 이제 이 사각형의 시작 점 (1, 3 ) 끝나는 점(5, 8) 을 result로 반환하면 [1, 3, 5, 8] 이 됩니다. 이제 아래..

DB 락(Lock)과 Lock의 종류에 대해 알아보자. [내부링크]

우선 Lock에 대해 알아보기 전에 트랜잭션에 대한 이해가 필요하므로 트랜잭션에 대해 모른다면 아래 포스팅을 참고하시길 바랍니다. 트랜잭션이란? 특징과 사용법에 대해 쉽게 알아보자 트랜잭션(Transaction) 트랜잭션은 DB의 상태를 변경시키기 위해 수행하는 작업 단위입니다. 여기서 DB의 상태를 변경시킨다는 SELECT, UPDATE, INSERT, DELETE 와 같은 쿼리를 날려 연산을 수행하는 것입니 hstory0208.tistory.com 락(Lock)이란 ? 두 명의 사용자가 DB에 접근해 아래 처럼 2개의 DB 세션을 사용한다고 가정해봅시다. ( 여기서는 H2 DB 사용 ) 편의상 두 개의 세션을 나눠서 세션1, 세션2라고 부르겠습니다. 세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안..

트랜잭션이란? 특징과 사용법에 대해 쉽게 알아보자 [내부링크]

트랜잭션(Transaction) 트랜잭션은 DB의 상태를 변경시키기 위해 수행하는 작업 단위입니다. 여기서 DB의 상태를 변경시킨다는 SELECT, UPDATE, INSERT, DELETE 와 같은 쿼리를 날려 연산을 수행하는 것입니다. 트랜잭션을 좀 더 쉽게 풀이해서 이야기 하자면, 트랜잭션을 한국어로 번역하면 "거래" 즉, DB에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것이라고 할 수 있습니다. 그런데 여기서 거래를 안전하게 처리하도록 보장해준다는 말이 무엇일까요? 이 얘기를 쉽게 이해하기 위해 우리가 일상속에서 자주 이용하는 계좌이체를 예시로 들 수 있습니다. 계좌이체 예시 ( 트랜잭션이 없을 경우 ) 짱구와 철수가 있습니다. 짱구와 철수는 각각 계좌에 10000원씩 있습니다. 짱..

java: warning: source release 17 requires target release 17 [내부링크]

인텔리제이로 테스트 코드를 테스트 돌리던 와중 기존엔 발생하지 않던 에러가 갑자기 발생했습니다. java: warning: source release 17 requires target release 17 해당 에러는 설정만 조금 건들여주면 쉽게 해결 가능합니다. 참고로 제가 사용하고 있는 자바 버전은 JAVA 11 입니다. 오류 해결 1. "파일 -> 설정 -> 빌드, 실행, 배포 -> 컴파일러 -> Java 컴파일러" 경로로 들어갑니다. 2. 모듈당 바이트코드 버전: 밑에 + 버튼을 클릭해 현재 프로젝트를 선택하여 추가합니다. 3. 그 다음 대상 바이트코드 버전을 현재 사용하고 있는 JAVA 버전과 똑같이 설정하고 적용합니다. 버전과 관련된 호환성 체크 및 버전 정보 설정 만약 새 JAVA 버전을 다운..

[Python/파이썬] 프로그래머스 Lv1 - 달리기 경주 [내부링크]

문제 설명 제한사항 입출력 예 Solution.py 이 문제를 풀기 위해 2개의 딕셔너리를 활용했는데 하나는 달리기 순위를 key로 갖고 선수 이름을 value로 갖는 rank_Dic 다른 하나는 선수 이름을 key로 갖고 달리기 순위를 value로 갖는 player_Dic 으로 만들었습니다. 두 개의 딕셔너리를 활용하는 이유는 아래의 코드를 보면 이해되겠지만, 순위가 변경될 때 서로의 value값을 참조하기 때문입니다. 서로의 value값을 참조하며 callings 배열에 있는 선수들 정보를 가지고 이름을 불린 선수와 그 선수의 앞에 있는 선수를 서로 변경하여 마지막으로 result 에 맞도록 rank_Dic의 value들을 반환합니다. 정답 코드 def solution(players, callings..

[Spring] Bean Validation - 유효성 검증 [내부링크]

이전 포스팅에서 유효성 검증하는 법에 대해 알아봤었습니다. (이전 포스팅에서 다룬 내용들은 이번 포스팅에서는 생략) [Spring] 유효성 검증하기 (Validation) 웹 애플리케이션을 만들고 유효성 검증을 추가 하지 않는다면, 사용자가 폼에 잘못된 값을 입력할 시 아래와 같은 오류화면을 만나게 될 것 입니다. 이렇게 되면 클라이언트 입장에서는 상당히 hstory0208.tistory.com 하지만 이 전처럼 검증 기능을 매번 코드로 작성하는 것은 상당히 번거로운 작업입니다. 스프링은 이런 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고, 표준화한 Bean Validation을 제공합니다. Bean Validation을 잘 활용하면, 애노테이션 하나로 검증 로직을 매우 편리하게 적용할 수 있습..

[Spring] 유효성 검증하기 (Validation) [내부링크]

웹 애플리케이션을 만들고 유효성 검증을 추가 하지 않는다면, 사용자가 폼에 잘못된 값을 입력할 시 아래와 같은 오류화면을 만나게 될 것 입니다. 이렇게 되면 클라이언트 입장에서는 상당히 당황스러울 것이고 입력한 값이 모두 날라가 처음부터 다시 작성해야 하는 일이 생깁니다. 또한 우리가 웹 사이트에서 값을 잘못입력했다고 이런 오류화면을 본적도 없죠. 우리는 웹 서비스를 할 때 이렇게 클라이언트가 해결하지 못하는 오류 화면을 보여줄 것이 아니라 클라이언트가 잘 못 입력했을 시 무엇을 잘못 입력했는지, 어떻게 입력해야하는 지를 알려줘야합니다. 그래서 Validation 검증 기능을 추가해 어떤 값을 잘못 입력했는지 알 수 있도록 해봅시다. 결과물과 주의점 이 포스팅은 검증 설명에 중점을 뒀기 때문에 예제에 사..

[Thymeleaf] 메시지 적용하기 [내부링크]

상품명 가격 수량 아래의 HTML 코드를 보면 상품명 또는 가격, 수량으로 각 구분자의 표시되는 이름들이 하드코딩 되어있습니다. 지금이야 간단한 HTML 이라서 상관은 없겠지만, 만약 여러 HTML에 동일하게 적용되어있는 상품명, 가격, 수량의 이름이 변경되어야 한다면 어떨까요? 일일히 HTML을 다 들어가서 하나씩 지우고 수정하고 해야 할 것입니다. 이러한 번거로움 작업을 메시지 기능을 통해 관리하는 방법을 알아봅시다. 메시지 기능 적용하기 먼저 messages.properties 라는 메시지 관리용 프로퍼티 파일을 만들어 줍니다. 그리고 key , value 형식으로 값을 입력합니다. ( {0}, {1} ... 등 파라미터도 적용 가능) item=상품 item.id=상품 ID item.itemName..

[Python/파이썬] 프로그래머스 Lv2 - 숫자 나누기 (유클리드호제법) [내부링크]

문제 설명 제한사항 입출력 예 Solution.py 첫 번째, 두 번째 조건을 보면 철수가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고 영희가 가진 카드들에 적힌 모든 숫자들 중에 하나도 나눌수 없는 양의 정수 a => 철수가 가진 카드들의 최대 공약수 영희가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고 철수가 가진 카드들에 적힌 모든 숫자들 중에 하나도 나눌수 없는 양의 정수 a => 영희가 가진 카드들의 최대 공약수 로 해석할 수 있습니다. 유클리드 호제법을 사용해 철수와 영희의 카드뭉치 최대공약수를 구하기 구한 최대공약수로 두 조건들을 적용 두 최대공약수 중 가장 큰 값을 반환 정답 코드 def solution(arrayA, arrayB): answer = 0 # array의 첫 번째 값이 최대..

[Thymeleaf] 입력 폼(Form) 처리 [내부링크]

타임리프는 스프링과 통합을 위한 다양한 기능을 편리하게 제공합니다. 스프링 통합으로 추가되는 기능들 스프링의 SpringEL 문법 통합 ${@myBean.doSomething()} 처럼 스프링 빈 호출 지원 편리한 폼 관리를 위한 추가 속성 th:object (기능 강화, 폼 커맨드 객체 선택) th:field , th:errors , th:errorclass 폼 컴포넌트 기능 checkbox, radio button, List 등을 편리하게 사용할 수 있는 기능 지원 스프링의 메시지, 국제화 기능의 편리한 통합 스프링의 검증, 오류 처리 통합 스프링의 변환 서비스 통합(ConversionService) 입력 폼 처리 th:object 커맨드 객체를 지정 *{...} 선택 변수 식 (th:object 에..

[Thymeleaf] 템플릿 레이아웃 적용하기 [내부링크]

레이아웃을 사용하는 이유? 레아아웃을 사용하는 이유는 만약 100개의 페이지에 똑같은 header와 footer가 들어갈 경우 각각의 HTML마다 똑같은 header와 footer를 추가하는 것은 상당히 비효율적이고 유지보수면에서도 좋지 않습니다. 그래서 반복되는 화면이 있어 HTML 코드를 줄일 때 레이아웃을 적용하면 상당히 효과적입니다. 템플릿 조각 템플릿 조각은 공통으로 적용할 부분을 조각조각으로 만들어 필요한 공통의 부분들에 가져다 쓰는 방식입니다. 가 있는 태그는 다른곳에 포함되는 코드 조각으로 코드 조각을 사용할 때는 조각 표현식 ~{...}를 사용합니다. Controller @Controller @RequestMapping("/template") public class TemplateCont..

Thymeleaf(타임리프)란 ? 타임리프의 기본 기능알아보기 [내부링크]

Thymeleaf(타임리프)란 ? 타임리프는 JSP, Freemarker와 같은 템플릿 엔진의 일종으로 다음과 같은 특징을 갖고 있습니다. 서버 사이드 HTML 렌더링 (SSR) 백엔드 서버에서 HTML을 동적으로 렌더링 하는 용도로 사용합니다. 네츄럴 템플릿 타임리프는 순수 HTML을 최대한 유지하는 특징을 가지기 때문에, 타임리프로 작성한 파일은 HTML을 유지해서 웹 브라우저에서 파일을 직접 열어도 내용을 확인할 수 있고, 서버를 통해 뷰 템플릿을 거치면 동적으로 변경된 결과를 확인할 수도 있습니다. 이렇게 순수 HTML을 그대로 유지하면서 뷰 템플릿도 사용할 수 있는 타임리프의 특징을 네츄럴 템플릿 (natural templates)이라고 합니다. 스프링 통합 지원 스프링과 통합되어 있어, 스프링..

[Spring] PRG(Post-Redirect-Get) 패턴이란? [내부링크]

PRG(Post-Redirect-Get) 웹 개발 패턴 중 자주 사용되는 패턴으로 HTTP POST 요청에 대한 응답이 GET 요청을 위한 URI로 리다이렉트되는 것 입니다. PRG 패턴을 사용하는 이유를 사용하는 이유는 사용하지 않았을 경우 다음과 같은 문제점이 있기 때문입니다. PRG패턴을 사용하지 않았을 경우 문제점 1. 새로고침으로 인해 동일한 요청을 연속적으로 보내지는 이슈 발생 웹 브라우저의 새로 고침은 마지막에 서버에 전송한 데이터를 다시 전송하게 됩니다. 그래서 만약 결제 같은 중요한 로직을 POST 방식으로 구현을 했다면, 마지막으로 서버에 전송한 데이터가 POST 요청에 대한 응답 결과물이기 때문에 새로고침을 한다면 계속 중복 결제가 되는 심각한 문제점이 발생하게 됩니다. 2. POST..

[Spring] HTTP 응답 방법과 관련 어노테이션(Annotation) [내부링크]

HTTP 응답 방법 3가지 스프링에서 응답 데이터를 만드는 방법은 크게 3가지가 있습니다. 정적 리소스 스프링 부트는 클래스 패스의 아래 디렉토리에 있는 정적 리소스를 제공합니다. /static , /public , /resources , /META-INF/resources src/main/resources는 리소스를 보관하는 곳이고, 또는 클래스패스의 시작 경로입니다. 스프링은 정적 리소스를 담을 다음과 같은 경로를 제공하고, 이 디렉토리에 리소스를 넣어두면 스프링 부트가 정적 리소스로 서비스를 제공합니다. src/main/resources/static 만약 src/main/resources/static/test/index.html 경로에 파일이 들어있으면 웹 브라우저에서 다음과 같이 실행하면 정정 파..

[Spring] HTTP 요청 방법과 관련 어노테이션(Annotation) [내부링크]

HTTP 요청 방법 3가지 스프링 HTTP 요청 방법 3가지는 다음과 같이 이뤄져있습니다. GET 방식 메시지 바디 없이, URL의 “쿼리 파라미터”를 사용해 데이터를 전달합니다. ( EX : 검색, 필터, 페이징 등에서 많이 사용 ) 쿼리 파라미터는 URL에 다음과 같이 ? 를 시작으로 보낼 수 있습니다. 추가 파라미터는 & 로 구분합니다. http://localhost:8080/request-param?username=hello&age=2 POST 방식 - HTML Form HTML의 Form을 사용해서 클라이언트에서 서버로 데이터를 전송하는 방식으로 , 주로 회원 가입, 상품 주문 등에서 사용합니다. 컨텐츠 타입은 다음과 같으며 application/x-www-form-urlencoded 메시지 바..

Tread Pool(쓰레드 풀)이란? [내부링크]

클라이언트가 서버에 요청을 할 때 다음과 같은 동작 과정이 있습니다. 클라이언트가 WAS에 요청 서버는 TCP/IP 커넥션 연결 후 서블릿을 호출 그런데 이 서블릿 객체는 누가 호출하는 걸 까요?? 이 서블릿 객체는 바로 Tread(쓰레드)가 호출합니다. Tread (쓰레드) 자바 Main 메서드를 실행하면 main이라는 이름의 쓰레드가 실행되는 것을 볼 수 있는데, 애플리케이션 코드를 하나하나 순차적으로 실행하는 것을 쓰레드라고 볼 수 있습니다. 만약 쓰레드가 없다면 자바 애플리케이션이 실행이 불가능합니다. 쓰레드는 한번에 하나의 코드 라인만 수행하며 동시 처리가 필요하면 쓰레드를 추가로 생성하게 됩니다. 단일 요청 - 쓰레드 하나 사용 시 WAS는 요청이 오면 쓰레드를 할당하고 그 쓰레드가 서블릿을 ..

Web과 WAS란 ? 웹 서비스의 구조에 대해 알아보자 [내부링크]

Web Server (웹 서버) 웹 서버란, HTTP 프로토콜을 기반으로 동작하는 서버로, 동작하는 방식은 클라이언트가 웹 서버에 HTTP 요청을 보내면 웹 서버는 HTTP로 응답하여 정적 리소스를 제공합니다. 대표적인 웹 서버 - Nginx - Apache WAS - Web Application Server (웹 어플리케이션 서버) WAS도 Web 서버처럼 HTTP 프로토콜을 기반으로 동작하고 웹 서버 기능을 포함하여 동적 리소스도 제공 할 수 있는 Application 서버입니다. WAS는 서블릿 컨테이너 또는 웹 컨테이너를 제공하고 컨테이너를 통해 프로그램 코드를 실행해 애플리케이션 로직을 수행하거나 DB 조회 등.. 동적 리소스를 제공합니다. 대표적인 WAS - Tomcat (톰캣) - Jetty..

HTTP 메서드 종류 및 속성 [내부링크]

HTTP 메서드 종류 HTTP 메서드란 클라이언트와 서버 사이에 이뤄지는 요청과 응답 데이터를 전송하는 방식입니다. HTTP 메서드는 총 9가지가 있으며 주로 GET, POST, PUT, PATCH, DELETE를 사용합니다. 메서드 이름 설 명 GET 리스소 조회 POST 등록, 요청 데이터 처리 PUT 리소스 덮어쓰기 (해당 리소스가 없으면 생성) PATCH 리소스 부분 분경 (PUT은 전체 변경이지만, PATCH는 일부만 변경) DELETE 리소스 삭제 HEAD GET과 동일하나 메시지 부분(Body)를 제외하고, 상태 줄과 헤더만 반환 OPTIONS 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명 (주로 CORS에서 사용) CONNECT 대상 자원으로 식별되는 서버에 대한 터널을 설정 TRAC..

HTTP란? 무상태성과 비연결성에 대해 알아보자. [내부링크]

HTTP (HyperText Transfer Protocol) 인터넷에서 데이터를 주고받을 수 있는 프로토콜(규칙)으로 이렇게 규칙을 정해두었기 때문에, 모든 프로그램이 이 규칙에 맞춰 개발해서 서로 정보를 교환할 수 있습니다. 지금은 HTTP 시대라 할 만큼 모든 형태의 데이터를 HTTP를 사용해 전송할 수 있습니다. HTML, TEXT IMAGE, 음성, 영상, 파일 JSON, XML 서버간의 데이터를 주고 받을 때 거의 모든 형태의 데이터 전송 가능 HTTP의 역사 HTTP/0.9 - 1991년 : GET 메서드만 지원, HTTP 헤더 X HTTP/1.0 - 1996년 : 메서드, 헤더 추가 HTTP/1.1 - 1997년 : 현재 가장 많이 사용하는 버전 HTTP/2 - 2015년 : 성능 개선 H..

[Spring] Lombok(롬복)이란 ? 설치부터 사용법까지 [내부링크]

Lombok 이란? Java의 라이브러리로 반복되는 메서드를 Anntation을 사용해 자동으로 작성해주는 아주 편리한 라이브러리입니다. Java에서 보통 Model 클래스나 Entity같은 도메인 클래스 등에는 여러 속성이 존재하고 이들이 갖는 프로퍼티에 대해서 Getter, Setter, 생성자 등을 매번 작성해줘야하지만 Lombok을 이용한다면 어노테이션을 이용하는 것 만으로 자동으로 Getter, Setter, 생성자 등의 코드를 작성해줘 번거로운 과정을 제거해줍니다. 인텔리제이 Lombok 설치 및 적용 방법 1. 파일 -> 설정 -> 플러그인 에서 lombok을 검색 후 플러그인을 설치합니다. 2. build.gradle의 dependency에 아래 코드를 추가합니다. dependencies ..

[Spring] @PostConstruct와 @PreDestory 스프링 빈 생명주기 관리 [내부링크]

Spring Bean의 생명 주기 Spring Bean은 다음과 같은 생명 주기를 갖습니다. 스프링 컨테이너 생성 => 스프링 빈 생성 => 의존 관계 주입(DI) => 초기화 콜백 => 사용 => 소멸전 콜백 => 스프링 종료 위 생명 주기를 보면 스프링 빈(Spring Bean)은 객체를 생성하고, 의존관계 주입이 다 끝난 후에야 필요한 데이터를 사용할 수 있는 준비가 완료 됩니다. 즉, 생성자가 호출되었을 때 스프링 빈은 초기화 전이고 DI(의존관계 주입)이 이루어 지고 나서야 스프링 빈이 초기화 됩니다. 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출하게 되는데, 개발자가 의존관계 주입이 완료된 시점이 언제인지 알 수 있는 방법이 없습니다. 그래서 Spring은 다음과 같은 빈 생명주..

Spring(스프링)과 Spring Boot(스프링부트)를 왜 사용하는가? [내부링크]

Spring이 나오기 이전엔 ? Java로 개발을 하던 초기에는 EJB(Enterprise Java Beans) 라는 기술을 사용했었습니다. 하지만 EJB는 이론적인 부분은 매력적이였지만 상당히 가격이 비쌌고, 복잡하고 어렵고 느리다는 단점이 있어 EJB로 개발하는 것은 지옥과 같다는 말이 나올 정도로 부정적인 말이 많았습니다. 그래서 차라리 EJB를 쓸 빠에는 POJO(Plain Old Java Object) 순수한 옛날 자바로 돌아가자라는 말이 나오기도 했었습니다. 그러다 EJB에 지친 개발자들이 오픈소스 프로젝트로 Spring이라는 오픈소스 기술을 개발하였고 이 Spring은 EJB의 복잡하고 어렵고 느리고 비싼 단점들을 개선하고 수 많은 편의기능들을 제공하여 Spring이라는 이름은 "EJB라는 ..

[Python/파이썬] 프로그래머스 Lv2 - 줄 서는 방법 [내부링크]

Solution.py 처음에는 permutations로 순열을 이용해 문제를 풀었는데 Lv2 답게 간단하게 문제가 풀릴일이 없이 효율성, 시간 초과로 실패했습니다. 이 문제를 풀기 위해서는 수학적으로 접근해야하는데, 먼저 맨 앞의 숫자가 1일 때, 1을 맨 앞의 원소로 갖는 순열은 [1, 2, 3] , [1, 3, 2] 로 총 두 가지 입니다. 이 경우의 수는 (n - 1)!을 계산했을 시 나올 수 있는 경우의 수가 됩니다. 파이썬의 math 모듈에서 factorial() 팩토리얼 메서드를 제공 해줍니다, 그 다음으로는 이 문제에서 k 번째 방법을 반환하라고 했는데, k의 수를 인덱스 값으로 변환하여 k - 1 을 해줘야합니다. k 번째에 있는 수를 구하기 위해서 (k - 1) // math.factor..

[Python/파이썬] 프로그래머스 Lv2 - 수식 최대화 (카카오 인턴쉽) [내부링크]

문제 설명 IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과 같은 방식으로 결정하려고 합니다. 해커톤 대회에 참가하는 모든 참가자들에게는 숫자들과 3가지의 연산문자(+, -, *) 만으로 이루어진 연산 수식이 전달되며, 참가자의 미션은 전달받은 수식에 포함된 연산자의 우선순위를 자유롭게 재정의하여 만들 수 있는 가장 큰 숫자를 제출하는 것입니다. 단, 연산자의 우선순위를 새로 정의할 때, 같은 순위의 연산자는 없어야 합니다. 즉, + > - > * 또는 - > * > + 등과 같이 연산자 우선순위를 정의할 수 있으나 +,* > - 또는 * > +,-처럼 2개 이상의 연산자..

spring-boot-devtools - 서버 재시작 없이 프론트 반영하는 법 [내부링크]

Sping boot를 이용하면서 어플리케이션의 프론트 변경사항이 변경될 때 서버를 종료했다 다시 시작했다 하는 건 상당히 귀찮은 부분 입니다... 하지만 이 귀찮은 부분을 spring-boot-devtools 라이브러리로 재시작하지 않고 페이지를 새로고침함으로써 변경사항을 반영시킬 수 있습니다. 적용 방법은 정말 간단합니다. 1. build.gradle에 의존성 추가 아래의 코드를 build.gradle의 dependencies에 추가합니다. developmentOnly 'org.springframework.boot:spring-boot-devtools' 2. IntelliJ 환경 설정 1. File -> Setting -> Advanced Settings -> Compiler안의 아래 항목 활성화 2...

Servlet으로 접속시 HTTP 404 에러 해결 방법 [내부링크]

Intelij에서 서블릿 컨테이너로 Tomcat을 사용 시 아래 처럼 JSP로 접속 시 200, servlet으로 접속 시 404 에러를 반환하는 경우가 있습니다. servlet만 404가 뜨는 이유는 Tomcat 버전과 Java EE 버전이 맞지 않아서 그런것인데 아래와 같이 Java EE 버전과 Tomcat 버전을 맞추면 정삭적으로 Servlet 접속 시 작동하게 됩니다. JAVA EE 8 + Apache Tomcat 9.0.X JAVA EE 7 + Apache Tomcat 8.5.X JAVA EE 7 + Apache Tomcat 8.0.X Java EE의 버전 확인 아래 방법은 버전 확인만 가능하고 변경은 하지 못합니다. 버전을 변경하고 싶다면 글을 아래로 스크롤해주세요. 프로젝트 우클릭 + Add..

Gradle이란? 왜 사용하는지에 대해 알아 보자. [내부링크]

Gradle이란 ? Gradle은 CI/CD를 위해 아래 작업들을 자동화 시켜 주는 Groovy 기반의 오픈소스 빌드 도구입니다. Compile - Java 파일의 소스 코드를 컴퓨터가 이해할 수 있도록 바이트 코드로 변환 Test - 유닛 테스트, UI 테스트 Packaging - 스프링 코드를 패키징 해 .jar 파일이나 .war 파일로 생성 Deploy & Run - 서버 실행 빌드 도구란? 소프트웨어 개발에 있어서 소스 코드를 실행 가능한 어플리케이션으로 만들어주는 도구를 말합니다. 빌드 과정을 자동화하여 관리하는 기능을 하기 때문에 빌드 관리 도구 도는 빌드 자동화 도구라고 불리기도합니다. Gradle Project 구성 .gradle - gradle 버전 별 엔진 및 설정 파일 .idea - ..

[Python/파이썬] 프로그래머스 Lv2 - 방금그곡 (카카오 블라인드) [내부링크]

문제 설명 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV, 라디오 등에서 나온 음악에 관해 제목 등의 정보를 제공하는 서비스이다. 네오는 자신이 기억한 멜로디를 가지고 방금그곡을 이용해 음악을 찾는다. 그런데 라디오 방송에서는 한 음악을 반복해서 재생할 때도 있어서 네오가 기억하고 있는 멜로디는 음악 끝부분과 처음 부분이 이어서 재생된 멜로디일 수도 있다. 반대로, 한 음악을 중간에 끊을 경우 원본 음악에는 네오가 기억한 멜로디가 들어있다 해도 그 곡이 네오가 들은 곡이 아닐 수도 있다. 그렇기 때문에 네오는 기억한 멜로디를 재생 시간과 제공된 악보를 직접 보면서 비교하려고..

[Python/파이썬] 프로그래머스 Lv2 - 두 큐 합 같게 만들기 (카카오 인턴쉽) [내부링크]

문제 설명 길이가 같은 두 개의 큐가 주어집니다. 하나의 큐를 골라 원소를 추출(pop)하고, 추출된 원소를 다른 큐에 집어넣는(insert) 작업을 통해 각 큐의 원소 합이 같도록 만들려고 합니다. 이때 필요한 작업의 최소 횟수를 구하고자 합니다. 한 번의 pop과 한 번의 insert를 합쳐서 작업을 1회 수행한 것으로 간주합니다. 큐는 먼저 집어넣은 원소가 먼저 나오는 구조입니다. 이 문제에서는 큐를 배열로 표현하며, 원소가 배열 앞쪽에 있을수록 먼저 집어넣은 원소임을 의미합니다. 즉, pop을 하면 배열의 첫 번째 원소가 추출되며, insert를 하면 배열의 끝에 원소가 추가됩니다. 예를 들어 큐 [1, 2, 3, 4]가 주어졌을 때, pop을 하면 맨 앞에 있는 원소 1이 추출되어 [2, 3, ..

JSP(JavaServer Pages)와 Servlet(서블릿)이란? [내부링크]

JSP와 Servlet은 레거시 시스템에 주로 사용되어 왔고, 요즘 프로젝트에서는 잘 사용되지 않는다고 합니다. 하지만 어느정도에 대한 이해는 필요하기 때문에 포스팅을 다뤄보려합니다. JSP와 Servlet은 모두 웹 애플리케이션 개발에 사용되는 Java 기술으로 웹(Web)을 조금 더 쉽게 다룰 수 있도록 해주는 확장 기능입니다. 이 둘은 서로 비슷한 점이 많지만 목적과 구현에서 근본적으로 다릅니다. 그래서 이번 포스팅에서는 이 둘의 개념과 차이점에 대해 포스팅해보려합니다. Servlet servlet은 웹 서버에서 실행되고 HTTP 요청에 대한 동적인 처리가 가능한 파일 확장자가 .java인 Java 프로그램으로, 웹을 다룰 수 있도록 해주는 "HttpServlet" 클래스를 상속받은 클래스들을 se..

[Python/파이썬] 프로그래머스 Lv2 - 괄호 변환 (카카오 블라인드 테스트) [내부링크]

문제 설명 카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 컴파일하여 로그를 보니 대부분 소스 코드 내 작성된 괄호가 개수는 맞지만 짝이 맞지 않은 형태로 작성되어 오류가 나는 것을 알게 되었습니다. 수정해야 할 소스 파일이 너무 많아서 고민하던 "콘"은 소스 코드에 작성된 모든 괄호를 뽑아서 올바른 순서대로 배치된 괄호 문자열을 알려주는 프로그램을 다음과 같이 개발하려고 합니다. 용어의 정의 '(' 와 ')' 로만 이루어진 문자열이 있을 경우, '(' 의 개수와 ')' 의 개수가 같다면 이를 균형잡힌 괄호 문자열이라고 부릅니다. 그리고 여기에 '('와 ')'의 괄호의 짝..

Spring Security 기본 로그인 화면 제거하는 간단한 방법 [내부링크]

spring을 실행시켜 localhost:8080으로 접속 시 만들지도 않은 아래와 같은 로그인 화면이 나와서 당황스러웠었습니다. 검색해서 알아 본 결과, 해당 페이지는 build.gradle에 스프링 시큐리티 의존성을 주입하면 자동으로 추가되는 화면 이라고 합니다. 이전에 책으로 실습했던 프로젝트의 의존성을 그대로 갖고왔다보니 OAuth2의 의존성도 같이 가져와 해당 페이지가 나오는 것이였습니다. implementation('org.springframework.boot:spring-boot-starter-oauth2-client') // 스프링 시큐리티 의존성 이 기본 로그인 페이지를 없애려면 어플리케이션이 실행되는 Main.java 클래스 파일에 다음과 같이 @SpringBootApplication ..

[Python/파이썬] 프로그래머스 Lv2 - 롤케이크 자르기 [내부링크]

문제 설명 예를 들어, 롤케이크에 4가지 종류의 토핑이 올려져 있다고 합시다. 토핑들을 1, 2, 3, 4와 같이 번호로 표시했을 때, 케이크 위에 토핑들이 [1, 2, 1, 3, 1, 4, 1, 2] 순서로 올려져 있습니다. 만약 세 번째 토핑(1)과 네 번째 토핑(3) 사이를 자르면 롤케이크의 토핑은 [1, 2, 1], [3, 1, 4, 1, 2]로 나뉘게 됩니다. 철수가 [1, 2, 1]이 놓인 조각을, 동생이 [3, 1, 4, 1, 2]가 놓인 조각을 먹게 되면 철수는 두 가지 토핑(1, 2)을 맛볼 수 있지만, 동생은 네 가지 토핑(1, 2, 3, 4)을 맛볼 수 있으므로, 이는 공평하게 나누어진 것이 아닙니다. 만약 롤케이크의 네 번째 토핑(3)과 다섯 번째 토핑(1) 사이를 자르면 [1, 2..

[Python/파이썬] 프로그래머스 Lv2 - 덧칠하기 (deque) [내부링크]

문제 설명 어느 학교에 페인트가 칠해진 길이가 n미터인 벽이 있습니다. 벽에 동아리 · 학회 홍보나 회사 채용 공고 포스터 등을 게시하기 위해 테이프로 붙였다가 철거할 때 떼는 일이 많고 그 과정에서 페인트가 벗겨지곤 합니다. 페인트가 벗겨진 벽이 보기 흉해져 학교는 벽에 페인트를 덧칠하기로 했습니다. 넓은 벽 전체에 페인트를 새로 칠하는 대신, 구역을 나누어 일부만 페인트를 새로 칠 함으로써 예산을 아끼려 합니다. 이를 위해 벽을 1미터 길이의 구역 n개로 나누고, 각 구역에 왼쪽부터 순서대로 1번부터 n번까지 번호를 붙였습니다. 그리고 페인트를 다시 칠해야 할 구역들을 정했습니다. 벽에 페인트를 칠하는 롤러의 길이는 m미터이고, 롤러로 벽에 페인트를 한 번 칠하는 규칙은 다음과 같습니다. 롤러가 벽에..

[Python/파이썬] 프로그래머스 Lv2 - 메뉴 리뉴얼 (Combinations) [내부링크]

문제 설명 레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서 새로운 메뉴를 제공하기로 결정했습니다. 어떤 단품메뉴들을 조합해서 코스요리 메뉴로 구성하면 좋을 지 고민하던 "스카피"는 이전에 각 손님들이 주문할 때 가장 많이 함께 주문한 단품메뉴들을 코스요리 메뉴로 구성하기로 했습니다. 단, 코스요리 메뉴는 최소 2가지 이상의 단품메뉴로 구성하려고 합니다. 또한, 최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합에 대해서만 코스요리 메뉴 후보에 포함하기로 했습니다. 예를 들어, 손님 6명이 주문한 단품메뉴들의 조합이 다음과 같다면, (각 손님은 단품메뉴를 2개 이상 주문해야 ..

Utterances - 댓글 기능 추가하기 [내부링크]

Utterances란? 직접 댓글 기능을 구현하지 않고 Utterances 오픈소스를 이용해 쉽고 간단하게 댓글 기능을 추가 할 수 있습니다. Utterances는 Github 이슈 기능을 이용했기 때문에 우리가 Github에서 흔히 볼 수 있던 댓글과 똑같이 생겼습니다. 또한 Github의 마크다운 에디터를 그대로 사용하고 있어 댓글을 마크다운으로도 작성이 가능 합니다. 댓글 기능을 추가할 수 있는 오픈소스가 이 외에도 더 있지만 Utterances는 다음과 같은 장점을 갖습니다. 오픈 소스. , 추적 없음, 광고 없음, 항상 무료. Github issue 기반 (GitHub issue 에 저장된 모든 데이터. ) css 툴킷인 Primer로 스타일이 지정. 어두운 테마 사용가능. 가벼..

[Java/자바] 프로그래머스 Lv2 - 2 x n 타일링(DP 알고리즘) [내부링크]

문제 설명 가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다. 타일을 가로로 배치 하는 경우 타일을 세로로 배치 하는 경우 예를들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다. 직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요. 제한사항 가로의 길이 n은 60,000이하의 자연수 입니다. 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요. 입출력 예 n result 4 5 ..

[Java/자바] 프로그래머스 Lv2 - 2개 이하로 다른 비트 [내부링크]

문제 설명 양의 정수 x에 대한 함수 f(x)를 다음과 같이 정의합니다. x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수 예를 들어, f(2) = 3 입니다. 다음 표와 같이 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 3이기 때문입니다. 수 비트 다른 비트의 개수 2 000...0010 3 000...0011 1 f(7) = 11 입니다. 다음 표와 같이 7보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 11이기 때문입니다. 수 비트 다른 비트의 개수 7 000...0111 8 000...1000 4 9 000...1001 3 10 000...1010 3 11 000...1011 2 정수들이 담긴 배열 numbers가 매개변수로 ..

[Java/자바] 프로그래머스 Lv2 - [3차]파일명 정렬 [내부링크]

문제 설명 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램의 과거 버전을 모두 담고 있어, 이름 순으로 정렬된 파일 목록은 보기가 불편했다. 파일을 이름 순으로 정렬하면 나중에 만들어진 ver-10.zip이 ver-9.zip보다 먼저 표시되기 때문이다. 버전 번호 외에도 숫자가 포함된 파일 목록은 여러 면에서 관리하기 불편했다. 예컨대 파일 목록이 ["img12.png", "img10.png", "img2.png", "img1.png"]일 경우, 일반적인 정렬은 ["img1.png", "img10.png", "img12.png", "img2.png"] 순이 되지만, 숫자 순으로 정렬..

[Java/자바] 프로그래머스 Lv2 - 프렌즈4블록 [내부링크]

문제 설명 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다. 만약 판이 위와 같이 주어질 경우, 라이언이 2×2로 배치된 7개 블록과 콘이 2×2로 배치된 4개 블록이 지워진다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워진다. 블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 된다. 만약 빈 공간을 채운 후에 다시 2×2 형태로 같은 모양의 블록이 모이면 다시 지워지고 떨어지고를 반복하게 된다. 위 초기 배치를 문자로 표시하면 아래와 같..

[Java/자바] 프로그래머스 Lv2 - 방문 길이 (HashSet) [내부링크]

문제 설명 게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다. U: 위쪽으로 한 칸 가기 D: 아래쪽으로 한 칸 가기 R: 오른쪽으로 한 칸 가기 L: 왼쪽으로 한 칸 가기 캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다. 예를 들어, "ULURRDLLU"로 명령했다면 1번 명령어부터 7번 명령어까지 다음과 같이 움직입니다. 8번 명령어부터 9번 명령어까지 다음과 같이 움직입니다. 이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다. 예를 들어 위의 예시에서 게임 캐릭터가 움직인 길이는 9이지만,..

[Java/자바] 프로그래머스 Lv2 - 소수 찾기 (완전탐색/DFS) [내부링크]

문제 설명 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요. 제한사항 numbers는 길이 1 이상 7 이하인 문자열입니다. numbers는 0~9까지 숫자만으로 이루어져 있습니다. "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다. 입출력 예 numbers return "17" 3 "011" 2 입출력 예 설명 예제 #1 [1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다. 예제 #2 [0, 1, 1]으로는 소수 [11, ..

[Java/자바] 프로그래머스 Lv2 - 가장 큰 수 (정렬) [내부링크]

문제 설명 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요. 제한 사항 numbers의 길이는 1 이상 100,000 이하입니다. numbers의 원소는 0 이상 1,000 이하입니다. 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다. 입출력 예 numbers return [6, 10, ..

[Java/자바] 프로그래머스 Lv2 - 할인 행사 [내부링크]

문제 설명 XYZ 마트는 일정한 금액을 지불하면 10일 동안 회원 자격을 부여합니다. XYZ 마트에서는 회원을 대상으로 매일 한 가지 제품을 할인하는 행사를 합니다. 할인하는 제품은 하루에 하나씩만 구매할 수 있습니다. 알뜰한 정현이는 자신이 원하는 제품과 수량이 할인하는 날짜와 10일 연속으로 일치할 경우에 맞춰서 회원가입을 하려 합니다. 예를 들어, 정현이가 원하는 제품이 바나나 3개, 사과 2개, 쌀 2개, 돼지고기 2개, 냄비 1개이며, XYZ 마트에서 15일간 회원을 대상으로 할인하는 제품이 날짜 순서대로 치킨, 사과, 사과, 바나나, 쌀, 사과, 돼지고기, 바나나, 돼지고기, 쌀, 냄비, 바나나, 사과, 바나나인 경우에 대해 알아봅시다. 첫째 날부터 열흘 간에는 냄비가 할인하지 않기 때문에 첫..

[Java/자바] 프로그래머스 Lv2 - 스킬트리 (정규식 사용) [내부링크]

문제 설명 선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다. 예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다. 위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다. 선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요. 제한 조건 ..

[알고리즘] 비트마스크(BitMask)란? [내부링크]

비트마스크(BitMask)란? 비트마스크는 이진수를 사용하는 컴퓨터의 연산 방식을 이용해, 정수의 이진수 표현을 자료 구조로 쓰는 기법을 말합니다. 이진수는 0 또는 1을 이용하므로 하나의 비트(bit)가 표현할 수 있는 2가지 경우가 있는데, 비트가 1이면 "켜져 있다"라고 말하며, 0이면 "꺼져 있다"라고 말합니다. 비트마스크를 사용하는 이유 c 빠른 수행시간 원소의 수가 많지 않을 때 사용되며, bit연산이기 때문에 시간복잡도 O(1)에 구현되는 것이 많습니다. c 작은 메모리 사용량 만약 bit가 10개인 경우, 각 bit당 두 가지의 경우를 가지기 때문에 2^10가지의 경우를 10bit 이진수 하나로 표현 가능합니다. 그렇기 때문에 하나의 정수로 매우 많은 경우의 수를 표현할 수 있기 때문에 메..

[Java/자바] 프로그래머스 Lv2 - 주식 가격(Queue 큐) [내부링크]

문제 설명 초 단위로 기록된 주식가격이 담긴 배열 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초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다. 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다. 5초 시점의 ₩3은..

[Java/자바] 프로그래머스 Lv2 - 주차 요금 계산 (HashMap, TreeMap) [내부링크]

문제 설명 주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다. 요금표 기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원) 180 5000 10 600 입/출차 기록 시각(시:분) 차량 번호 내역 05:34 5961 입차 06:00 0000 입차 06:34 0000 출차 07:59 5961 출차 07:59 0148 입차 18:59 0000 입차 19:09 0148 출차 22:59 5961 입차 23:00 5961 출차 자동차별 주차 요금 차량 번호 누적 주차 시간(분) 주차 요금(원) 0000 34 + 300 = 334 5000 + ⌈(334 - 180) / 10⌉ x 600 = 14600 014..

[알고리즘] 다익스트라(Dijkstra) - 최단거리 알고리즘 [내부링크]

다익스트라(Dijkstra) 다익스트라 알고리즘은 음의 가중치(음의 간선, 음의 값)가 없는 그래프에서 최단 거리를 구하는 알고리즘입니다. 가장 짧은 경로를 찾으므로 "길 찾기" 문제에 많이 사용됩니다. 이전 다익스트라의 경우 O(n^2)의 시간복잡도를 가졌었지만, 현재는 우선순위 큐를 이용한 개선된 다익스트라 알고리즘이 탄생해 O(ElogE)의 시간복잡도를 가집니다. ( E는 Node의 간선의 수 ) 만약 음의 간선이 존재한다면 "벨만-포드 알고리즘"을 활용해야 합니다. 다익스트라 알고리즘은 그리디 알고리즘과 다이나믹 프로그래밍 기법을 사용한 알고리즘입니다. 그 이유는 아래의 알고리즘 특징에서 설명하겠습니다. 다익스트라 알고리즘 특징 각 지점은 그래프에서 '노드' 또는 정점으로 표현되고 지점간 연결된 ..

[알고리즘] 라인 스위핑 (Sweeping) [내부링크]

Line Sweeping Sweeping이라는 단어를 번역하면 "싹슬이 하는"이라는 뜻을 가집니다. 즉, "한 쪽 방향부터 시작해서 다른 방향으로 스캔해가면서 쓸어가는 것"입니다. 보통 라인스위핑 알고리즘은 좌표 문제에 많이 사용되며 O(nlogN)의 시간 복잡도를 가집니다. 라인 스위핑 알고리즘 문제 (백준 2170 : 선 긋기) 문제 설명 매우 큰 도화지에 자를 대고 선을 그으려고 한다. 매우 큰 도화지에 자를 대고 선을 그으려고 한다. 선을 그을 때에는 자의 한 점에서 다른 한 점까지 긋게 된다. 선을 그을 때에는 이미 선이 있는 위치에 겹쳐서 그릴 수도 있는데, 여러 번 그은 곳과 한 번 그은 곳의 차이를 구별할 수 없다고 하자. 이와 같은 식으로 선을 그었을 때, 그려진 선(들)의 총 길이를 구..

[Java/자바] 프로그래머스 Lv2 - n진수 게임 [내부링크]

문제 설명 튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다. 숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다. 10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다. 이렇게 게임을 진행할 경우, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, … 순으로 숫자를 말하면 된다. 한편 코딩 동아리 일원들은 컴퓨터를 다루는 사람답게 이진수로 이 게임을 진행하기도 하는데, 이 경우에는 0, ..

[Java/자바] 프로그래머스 Lv2 - 오픈채팅방 (HashMap) [내부링크]

문제 설명 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다. "[닉네임]님이 들어왔습니다." 채팅방에서 누군가 나가면 다음 메시지가 출력된다. "[닉네임]님이 나갔습니다." 채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다. 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다. 채팅방에서 닉네임을 변경한다. 닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메시지의 닉네임도 전부 변경된다. 예를 들어, 채팅방..

[Java/자바] 프로그래머스 Lv2 - 더 맵게(우선순위 큐) [내부링크]

문제 설명 매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다. 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다. Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요. 제한 사항 scovil..

[Java/자바] 프로그래머스 Lv2 - 피로도 (완전탐색/dfs) [내부링크]

문제 설명 XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던전 탐험을 마쳤을 때 소모되는 "소모 피로도"가 있습니다. "최소 필요 피로도"는 해당 던전을 탐험하기 위해 가지고 있어야 하는 최소한의 피로도를 나타내며, "소모 피로도"는 던전을 탐험한 후 소모되는 피로도를 나타냅니다. 예를 들어 "최소 필요 피로도"가 80, "소모 피로도"가 20인 던전을 탐험하기 위해서는 유저의 현재 남은 피로도는 80 이상 이어야 하며, 던전을 탐험한 후에는 피로도 20이 소모됩니다. 이 게임에는 하루에 한 번씩 탐험할 수 있는 던전이 여러개 있는데, 한 유저가 오늘 이 던전들..

[Java/자바] 프로그래머스 Lv2 - [3차]압축 [내부링크]

문제 설명 신입사원 어피치는 카카오톡으로 전송되는 메시지를 압축하여 전송 효율을 높이는 업무를 맡게 되었다. 메시지를 압축하더라도 전달되는 정보가 바뀌어서는 안 되므로, 압축 전의 정보를 완벽하게 복원 가능한 무손실 압축 알고리즘을 구현하기로 했다. 어피치는 여러 압축 알고리즘 중에서 성능이 좋고 구현이 간단한 LZW(Lempel–Ziv–Welch) 압축을 구현하기로 했다. LZW 압축은 1983년 발표된 알고리즘으로, 이미지 파일 포맷인 GIF 등 다양한 응용에서 사용되었다. LZW 압축은 다음 과정을 거친다. 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다. 사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다. w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다. 입력에서..

[알고리즘] 투 포인터(Two Pointers)란? [내부링크]

투 포인터(Two Pointers) 투 포인터는 말 그대로 두 개의 포인터를 사용하여 문자열, 배열, List에서 원하는 값을 찾는 것 입니다. 투 포인터를 활용하기 위한 조건은 주어진 배열에서 연속된(정렬이 아닌) 부분 배열을 통해 문제를 해결할 수 있어야 합니다. 투 포인터 알고리즘을 활용하는 대표적인 예로는 배열에서 특정한 합을 갖는 부분 연속 수열을 찾을 때가 있습니다. 만약 이중 반복문을 통해 부분 연속 수열을 찾는다면 O(n^2)의 시간복잡도가 소요되는 반면 투 포인터를 활용한다면 O(n)의 시간복잡도로 시간을 단축 시킬 수 있습니다. 투 포인터는 두 개의 포인터를 사용하기 때문에 두 개의 인덱스를 가르키는 변수가 필요합니다. 그 변수를 하나는 "시작점을 가르키는 start", 다른 하나는 "..

[Java/자바] 프로그래머스 Lv2 - 연속 부분 수열 합의 개수 (Set) [내부링크]

문제 설명 철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같습니다. 원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요. 제한사항 3 ≤ elements의 길이 ≤ 1,000 1 ≤ el..

[알고리즘] LIS(최장 증가 부분 수열)이란 ? [내부링크]

LIS (Longest Increasing Subsequence) 최장 증가 부분 수열 최장 증가 부분 수열은 말 그대로 가장 길게 증가하는 부분 수열으로 즉, 어떤 수열에서 만들 수 있는 부분 수열 중에서 가장 길면서 오름차순을 유지하는 수열을 LIS라고 합니다. 좀 더 이해하기 쉽도록 아래 그림을 봅시다. 만약 위와 같은 배열이 있을 때 만들수 있는 증가 부분 수열은 위와 같으며 최장 증가 부분 수열은 만들 수 있는 증가 부분 수열 중 길이가 가장 긴 [1, 2, 6]이 됩니다. LIS를 구현하는 방법으로는 두가지가 있습니다. DP [알고리즘] 동적 프로그래밍 (DP) 란? feat.동적 계획법 동적 프로그래밍(Dynamic programming) 란? 동적 프로그래밍은 "큰 문제"를 "부분 문제"로..

[Java/자바] 프로그래머스 Lv2 - k진수에서 소수 개수 구하기 [내부링크]

문제 설명 양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다. 0P0처럼 소수 양쪽에 0이 있는 경우 P0처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우 0P처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우 P처럼 소수 양쪽에 아무것도 없는 경우 단, P는 각 자릿수에 0을 포함하지 않는 소수입니다. 예를 들어, 101은 P가 될 수 없습니다. 예를 들어, 437674을 3진수로 바꾸면 211020101011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 왼쪽부터 순서대로 211, 2, 11이 있으며, 총 3개입니다. (211, 2, 11을 k진법으로 보았을 때가 아닌, 10진..

[Java/자바] 프로그래머스 Lv2 - 타겟 넘버 (DFS 깊이 우선 탐색) [내부링크]

문제 설명 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 하도록 solution 함수를 작성해주세요. 제한사항 주어지는 숫자의 개수는 2개 이상 20개 이하입니다. 각 숫자는 1 이상 50 이하인 자연수입니다. 타겟 넘버는 1 이상 100..

[Java/자바] 프로그래머스 Lv2 - 귤 고르기 (getOrDefault 활용) [내부링크]

문제 설명 경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다. 예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다. 경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가..

[알고리즘] 힙 정렬(Heap Sort)이란? [내부링크]

먼저 힙 정렬에 대해 다루기 전에 "힙"에 대한 이해가 필요합니다. 힙에 대해 알고 싶다면 아래 링크를 참고하시면 도움됩니다. 힙(Heap) 자료구조 힙(Heap)이란 ? 완전 이진 트리의 일종으로, 데이터에서 최댓값과 최솟값을 빠르게 찾기 위해 만들어진 자료구조입니다. 힙을 사용하는 이유는 최댓값과 최솟값을 찾기 위해 배열을 사용하는 경 hstory0208.tistory.com 힙 정렬(Heap Sort) 힙 정렬 알고리즘은 삽입과정 없이 삭제과정만이 이뤄집니다. 최대힙(max heap)을 구현한뒤, 루트 노드를 삭제하여 마지막 노드가 루트 노드가 되어 최대힙의 규칙에 맞게 재구조화 되며 정렬합니다. 힙 정렬 알고리즘은 주로 다음과 같은 경우에 유용하게 사용됩니다. 최댓값과 최솟값을 구할 때 최대 k만..

힙(Heap) 자료구조 [내부링크]

힙(Heap)이란 ? 완전 이진 트리의 일종으로, 데이터에서 최댓값과 최솟값을 빠르게 찾기 위해 만들어진 자료구조입니다. 힙을 사용하는 이유는 최댓값과 최솟값을 찾기 위해 배열을 사용하는 경우 O(n)의 시간복잡도가 걸리는 반면, 힙을 사용하면 O(logn)의 시간복잡도가 소요되므로 시간적으로 효율적이기 때문입니다. 완전 이진 트리 (Complete Binary Tree)란 ? 이진 트리에 노드를 삽입할 때 왼쪽부터 차례대로 삽입하는 트리로 아래 그림과 같습니다. 만약, 왼쪽이 비어 있고 오른쪽이 채워져있다면 완전 이진 트리라고 할 수 없습니다. 힙의 특징 힙은 최대 힙과 최소 힙으로 나눠집니다. 최대 힙(max heap) : 부모 노드의 값이 자식 노드이 값보다 크거나 같은 완전 이진 트리. ( 부모 ..

[Java/자바] 프로그래머스 Lv2 - 전화번호 목록(해시) [내부링크]

문제 설명 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조대 : 119 박준영 : 97 674 223 지영석 : 11 9552 4421 전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요. 제한 사항 phone_book의 길이는 1 이상 1,000,000 이하입니다. 각 전화번호의 길이는 1 이상 20 이하입니다. 같은 전화번호가 중복해서 들어있지 않습니다. 입출력 예제 ph..

[알고리즘] Binary Search(이진 탐색/이분 탐색)이란? [내부링크]

Binary Search(이진 탐색/이분 탐색) 이진 탐색 알고리즘은 정렬되어 있는 배열에서 찾고자 하는 특정한 값을 찾아내는 알고리즘입니다. 이진 탐색 알고리즘이 탐색하는 방식은 배열의 중간에 있는 값(mid)을 선택하여 찾고자하는 값(x)과 비교합니다. 찾고자하는 값(x)가 중간 값(mid)보다 작으면 중간 값을 기준으로 왼쪽으로 다시 탐색, 크다면 오른쪽으로 다시 탐색합니다. 다시 탐색을 시작할 때 찾고자하는 값(x)가 중간 값(mid)보다 작으면 해당 중간 값부터 우측 끝값을 제거하고 다시 중간 값을 선택하고 찾고자하는 값(x)을 찾습니다. 반대로 찾고자하는 값(x)가 중간 값(mid)보다 크면 해당 중간 값부터 좌측 끝값을 제거 하고 다시 중간 값을 선택하고 찾고자하는 값(x)를 찾습니다. 찾고..

[알고리즘] 완전탐색(Exhaustive search)이란? [내부링크]

완전탐색 완전탐색이란 이름 그대로 모든 것을 탐색 즉, "모든 경우의 수를 다 만들어 보는 방법"입니다. 만약 휴대폰 비밀번호 4자리의 핀 번호를 까먹어서 0000 ~ 9999 까지 모든 수를 도전 해본다면, 최대 10000번의 도전이 있을 것입니다. 이 처럼 완전 탐색은 무식하게 모든 경우의 수를 전부 탐색하기 때문에 시간 복잡도가 매우 커서 입력값의 크기가 작을 때 사용하기 좋습니다. 완전탐색 알고리즘 1. Brute Force 단순한 반복문(for)과 조건문(if)으로 모든 경우의 수를 만들어 답을 구하는 방법입니다. 아주 기초적인 문제에 주로 나옵니다. 2. Bitmask (비트마스크) 2진수를 이용하는 컴퓨터의 연산을 이용하는 방식 나올 수 있는 모든 경우의 수가 "각각의 원소가 포함되거나, 포..

[알고리즘] 그리디 알고리즘(탐욕법) [내부링크]

Greedy(탐욕) 알고리즘이란 ? Greedy를 번역하면 "탐욕스러운"이라는 뜻을 가집니다. 그리디 알고리즘은 탐욕이란 뜻처럼 현재 상황에서 최적의 해만을 선택합니다. 그리디는 현재 상황의 최적의 해를 구하는다는 것에 중점을 두어야하는데, 그 이유는 다음 그림을 봅시다. 가장 큰수를 찾기 위해 앞으로 간다면 제일 큰 수가 있는 "1000"과 연결되어 있는 100 -> 1000 을 생각할 것입니다. 하지만 Greedy 알고리즘은 시작부터 두 수중 가장 큰 수인 "500"을 탐색하고 그 다음 큰 수인 "200"을 탐색합니다. 이 처럼 그리드는 최종결과에서의 최적의 해가 아닌 "현재상황에서 최적의 해"를 구합니다. 그리디 알고리즘 적용 조건 1. 탐욕스러운 선택 조건 앞의 선택이 이후의 선택에 영향을 주지 ..

[Java/자바] 프로그래머스 Lv2 - 프린터 [내부링크]

문제 설명 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다. 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다. 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. 3. 그렇지 않으면 J를 인쇄합니다. 예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다. 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 ..

[알고리즘] 백트래킹(Back Tracking)이란? [내부링크]

백트래킹(Back Tracking) 백트래킹은 깊이 우선 탐색(DFS)를 진행하며 탐색 중인 경로에 답이 없다고 판단되면 해당 노드를 제거하고, 탐색을 시작했던 부모 노드에서 바른 방향으로 다시 탐색합니다. 여기서 더 이상 탐색할 필요가 없는 노드를 제외하는 것을 가지치기(Pruning)이라 하고 해당 경로에 답이 있다고 판단되는 경우에는 유망하다(Promising)이라고 합니다. 즉, 백트래킹은 DFS탐색을 진행하며 유망한 조건을 만족하는 방향으로만 탐색하는 알고리즘입니다. 백트래킹 탐색 과정 ACG라는 단어를 찾는다고 가정했을 시 다음과 같은 순서로 탐색을 진행합니다. DFS탐색을 진행하여 "A"노드에서 "B"노드를 방문합니다. A다음 찾는 단어는 C로 "B"노드가 아니기 때문에 가지치기를 하고 부모..

[알고리즘] 깊이 우선 탐색(DFS), 너비 우선 탐색(BFS) [내부링크]

DFS (깊이 우선 탐색, Depth First Search) DFS는 그래프에서 깊은 부분을 우선적으로 탐색합니다. 한 정점에서 시작해 다음 경로로 넘어가기 전에 해당 경로를 완벽하게 탐색할 때 사용합니다. 특징 스택 자료 구조에 기초하며, 구현할 때 재귀 함수로 구현하는 것이 좀더 간편합니다. DFS를 구현할 때, 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 검사하지 않을 시 무한 루프에 빠질 위험이 있으므로 반드시 검사해야합니다. ( visited[index] = true; ) 미로를 탐색할 때, 해당 분기에서 갈 수 있을 때까지 계속 가다가 더 이상 갈 수 없게 되면 다시 가장 가까운 갈림길로(새로운 분기)로 돌아와서 다른 방향으로 다시 탐색을 진행하는 방법과 유사합니다. 모든 경우를 하나..

[Java/자바] 프로그래머스 Lv2 - n^2배열 자르기 [내부링크]

문제 설명 정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다. n행 n열 크기의 비어있는 2차원 배열을 만듭니다. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다. 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다. 정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요. 제한사항 1 ≤ n ≤..

[Java/자바] java.time 패키지 (날짜와 시간 다루기) [내부링크]

이전에 Date 클래스와 Calendar 클래스를 이용하여 날짜와 시간 데이터를 다루는 방법을 포스팅했었습니다. 이번에 포스팅할 java.time 패키지는 위 두 클래스의 단점을 보완한 패키지로 JDK1.8부터 추가되었습니다. java.time 패키지 패키지 설명 java.time 날짜와 시간을 다루는데 필요한 핵심 클래스들을 제공 java.time.chrono 표준(ISO)이 아닌 달력 시스템을 위한 클래스들을 제공 java.time.format 날짜와 시간을 파싱하고 형식화하기 위한 클래스들을 제공 java.time.temporal 날짜와 시간의 필드(field)와 단위(unit)를 위한 클래스들을 제공 java.time.zone 시간대(time-zone)와 관련된 클래스들을 제공 java.time ..

[Java/자바] 프로그래머스 Lv2 - 기능개발 (Queue) [내부링크]

문제 설명 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요. 제한 사항 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다. 작업 진도는 100 미만의 자연수입니다. 작업 속도는 100 이하의 자..

[Java/자바] 프로그래머스 Lv2 - 튜플 [내부링크]

문제 설명 셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다. (a1, a2, a3, ..., an) 튜플은 다음과 같은 성질을 가지고 있습니다. 중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2) 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2) 튜플의 원소 개수는 유한합니다. 원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, ..., an)이 주어질 때(단, a1, a2, ..., an은 자연수), 이는 다음과 같이 집합 기호 '{', '}'..

[Java/자바] 프로그래머스 Lv2 - 위장(HashMap) [내부링크]

문제 설명 스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다. 예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다. 종류 이름 얼굴 동그란 안경, 검정 선글라스 상의 파란색 티셔츠 하의 청바지 겉옷 긴 코트 스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요. 제한사항 clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다. 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다. 같은 이름을 가진 의상은 존재하지 않습니다. cloth..

[알고리즘] 시간 복잡도(Time Complexity)란? [내부링크]

시간 복잡도 (Time Complexity) 코드 문제들을 풀거나 기능을 구현하면서 자신의 코드와 다른 사람들의 코드를 보면서 이런식으로 효율적으로 코드를 짤 수 있구나 ~ 하는 경험들이 한 번씩은 다 있었을 겁니다. 그렇게 남들이 효율적으로 잘 짠 코드를 보면 "어떻게 효율적으로 코드를 짤 수 있을까"라는 생각들을 할텐데요. 효율적인 코드를 짠 다는 것은 코드가 실행되는데 걸리는 시간에 대해 고민하는 것과 같습니다. * 코드가 실행되는데 걸리는 시간 : 입력값의 변화에 따라 연산을 실행할 때, 연산 횟수에 비해 시간이 얼마나 걸리는지? * 효율적인 코드 : 입력값이 커짐에 따라 증가하는 시간의 비율을 최소화한 알고리즘을 구성 즉, 효율적인 알고리즘을 구현한다는 것은 시간의 비율을 최소화한 알고리즘을 구..

[Java/자바] 프로그래머스 Lv2 - 괄호 회전하기 (스택 Stack 활용) [내부링크]

문제 설명 다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다. (), [], {} 는 모두 올바른 괄호 문자열입니다. 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다. 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다. 대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return ..

[알고리즘] 누적합, 구간합 구하기 [내부링크]

누적합(Prefix Sum)과 구간합 누적합 누적합이란 나열 된 수들의 누적된 합을 뜻합니다. 즉, 이 배열의 누적합을 구하면 1 + 3 + 4 + 2 + 5 = 15가 됩니다. 누적합의 배열의 크기가 원본 배열보다 1더 큰데 이는 밑에서 설명하겠습니다. 구간합 말 그대로 나열 된 수 중에서 합을 구하고 싶은 구간의 합입니다. 만약 1번째 인덱스부터 ~ 3번째 인덱스까지의 구간합을 구한다면, 3 + 4 + 2 = 11이 됩니다. 구간합을 빠르게 구할 수 있는 공식이 있는데, 이 공식이 만들어지는 과정을 봅시다. 누적합 배열 prefixSum의 크기가 arr보다 1 더 큰 이유는 0번 인덱스 부터 n번 인덱스의 구간합을 구할 수 있게 하기 위함입니다. 이제 1번째 인덱스부터 ~ 3번째 인덱스까지의 구간합을..

[Java/자바] 프로그래머스 Lv2 - [1차]캐시 (LRU 알고리즘) [내부링크]

문제 설명 지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다. 이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다. 어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다. 어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오. 입력 형식 캐시 크..

[알고리즘] 캐시 교체 알고리즘 - LRU, LFU [내부링크]

이 내용을 다루기 앞서 이전에 포스팅했던 캐시에 대해 읽어보시는 것을 추천드립니다. 쿠키, 캐시, 세션 이란 ? 각 개념들과 차이점에 대해 쉽게 알아보자. 쿠키, 캐시, 세션에 대해 설명하기 전에 먼저 HTTP의 특징에 대해 짚고 넘어가야합니다. HTTP에 대한 설명은 아래 포스팅 참고하시면 좋습니다. HTTP와 HTTPS의 개념 및 차이점에 대해 알아보자. HTTP ( hstory0208.tistory.com CS면접의 단골 질문인 쿠키, 캐시, 세션에 대해 각 특징과 차이점들에 대해 설명해놓았으므로 도움이 되실 겁니다. 캐시가 사용하는 리소스의 양은 무한대가 아니라 제한적이기 때문에, 캐시는 제한된 리소스 내에서 데이터를 빠르게 저장하고 접근할 수 있어야합니다. 그래서 "캐시 교체 알고리즘"으로 어떤..

[Java/자바] 프로그래머스 Lv2 - 행렬의 곱셈 [내부링크]

문제 풀이 2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요. 제한 조건 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다. 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다. 곱할 수 있는 배열만 주어집니다. 입출력 예 arr1 arr2 return [[1, 4], [3, 2], [4, 1]] [[3, 3], [3, 3]] [[15, 15], [15, 15], [15, 15]] [[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]] Solutio..

[Java/자바] 프로그래머스 Lv2 - H-Index [내부링크]

문제 설명 H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다. 어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요. 제한사항 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다. 논문별 인용 횟수는 0회 이상 10,000회 이하입니다. 입출력 예 citations ret..

[Java/자바] 프로그래머스 Lv2 - 멀리 뛰기(DP알고리즘) [내부링크]

문제 설명 효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는 (1칸, 1칸, 1칸, 1칸) (1칸, 2칸, 1칸) (1칸, 1칸, 2칸) (2칸, 1칸, 1칸) (2칸, 2칸) 의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 알아내, 여기에 1234567를 나눈 나머지를 리턴하는 함수, solution을 완성하세요. 예를 들어 4가 입력된다면, 5를 return하면 됩니다. 제한 사항 n은 1 이상, 2000 이하인 정수입니다. 입출력 예 n result 4 5 3 3 Solution.java 이 문제는 DP 알고리즘을 활용하여 풀 수..

[Java/자바] 프로그래머스 Lv2 - 점프와 순간이동 [내부링크]

문제 설명 OO 연구소는 한 번에 K 칸을 앞으로 점프하거나, (현재까지 온 거리) x 2 에 해당하는 위치로 순간이동을 할 수 있는 특수한 기능을 가진 아이언 슈트를 개발하여 판매하고 있습니다. 이 아이언 슈트는 건전지로 작동되는데, 순간이동을 하면 건전지 사용량이 줄지 않지만, 앞으로 K 칸을 점프하면 K 만큼의 건전지 사용량이 듭니다. 그러므로 아이언 슈트를 착용하고 이동할 때는 순간 이동을 하는 것이 더 효율적입니다. 아이언 슈트 구매자는 아이언 슈트를 착용하고 거리가 N 만큼 떨어져 있는 장소로 가려고 합니다. 단, 건전지 사용량을 줄이기 위해 점프로 이동하는 것은 최소로 하려고 합니다. 아이언 슈트 구매자가 이동하려는 거리 N이 주어졌을 때, 사용해야 하는 건전지 사용량의 최솟값을 return..

[Java/자바] Scanner 클래스 (입력받기) [내부링크]

Scanner 클래스란? Scanner란 사용자로 부터 입력을 받을 수 있도록 도와주는 것으로, 간단한 예시를 보자면, 사용자가 게임에 로그인하기 위해, 아이디와 비밀번호를 입력하는 것과 같습니다. Scanner는 다음과 같은 특징을 가집니다. - 기본적인 데이터 타입을 모두 입력받을 수 있다. - 토큰을 기준으로 데이터를 입력받는다. (*토큰 : 공백 문자(Spacebar), 탭(Tab), 개행(Enter) 등으로 구분되는 요소*) - nextLine()은 띄어쓰기를 포함해 읽고, 나머지 메서드들은 띄어쓰기, 공백문자를 제외하고 읽는다. Scanner 클래스 사용 import java.util.Scanner; Scanner input = new Scanner(System.in); System.in 이란..

[Java/자바] SimpleDateFormat 클래스 (날짜 데이터 출력) [내부링크]

Date와 Calendar로 날짜를 계산할 수 있지만, 이 두 클래스만으로 날짜 데이터를 원하는 형태로 다양하게 출력하는 것은 불편합니다. 그래서 날짜 데이터를 원하는 형태로 출력하기 위해 SimpleDateFormat를 사용합니다. SimpleDateFormat 작성에 사용되는 기호 표 기호 의미 G BC (기원전) / AC (기원후) y 년도 M 월(1 ~ 12) w 년의 몇 번째 주(1 ~ 53) W 월의 몇 번째 주(1 ~ 5) D 년의 몇 번째 일(1 ~ 366) d 월의 몇 번째 일(1 ~ 31) F 월의 몇 번째 요일(1 ~ 5) E 요일 a 오전(AM) / 오후(PM) H 시간(0 ~ 23) k 시간(1 ~ 24) K 오전/오후 시간 (0 ~ 11) h 오전/오후 시간 (1 ~ 12) m ..

[Java/자바] 프로그래머스 Lv2 - 예상 대진표 [내부링크]

문제 설명 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N번의 참가자끼리 게임을 진행합니다. 각 게임에서 이긴 사람은 다음 라운드에 진출할 수 있습니다. 이때, 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다. 게임은 최종 한 명이 남을 때까지 진행됩니다. 이때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 ..

[Java/자바] 프로그래머스 Lv2 - N개의 최소공배수 (유클리드 호재법) [내부링크]

문제 설명 두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요. 제한 사항 arr은 길이 1이상, 15이하인 배열입니다. arr의 원소는 100 이하인 자연수입니다. 입출력 예 arr result [2,6,8,14] 168 [1,2,3] 6 Solution.java 이 문제를 풀기위해선 유클리드 호재법을 사용합니다. 저번 Lv1 문제를 풀면서 유클리드 호..

[Java/자바] 프로그래머스 Lv2 - 구명보트 (greedy 탐욕법) [내부링크]

문제 설명 무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다.s 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다. 구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다. 사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세..

[Java/자바] 프로그래머스 Lv2 - 영어 끝말잇기 [내부링크]

문제 설명 1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다. 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다. 이전에 등장했던 단어는 사용할 수 없습니다. 한 글자인 단어는 인정되지 않습니다. 다음은 3명이 끝말잇기를 하는 상황을 나타냅니다. tank → kick → know → wheel → land → dream → mother → robot → tank 위 끝말잇기는 다음과 같이 진행됩니다. 1번 사람이 자신의 첫 번째 차례에 tank를 말합니다. 2번 사람이 자신의 첫 번째 차례에 ..

[Java/자바] 프로그래머스 Lv2 - 짝지어 제거하기 [내부링크]

문제 설명 짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다. 예를 들어, 문자열 S = baabaa 라면 b aa baa → bb aa → aa → 의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다. 제한사항 문자열의 길이 : 1,000,000이하의 자연수 문자열은 모두 소문자로 이루어져 있습니다. ..

[Java/자바] 프로그래머스 Lv2 - 카펫 [내부링크]

문제 설명 Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요. 제한사항 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다. 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다. 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 ..

[Java/자바] 프로그래머스 Lv2 - 다음 큰 숫자 [내부링크]

문제 설명 자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다. 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다. 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다. 예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다. 자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요. 제한 사항 n은 1,000,000 이하의 자연수 입니다. 입출력 예 n result 78 83 15 23 Solution.java class Solution { public int solution(int ..

[Java/자바] 프로그래머스 Lv2 - 피보나치 수 [내부링크]

문제 설명 피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다. 예를들어 F(2) = F(0) + F(1) = 0 + 1 = 1 F(3) = F(1) + F(2) = 1 + 1 = 2 F(4) = F(2) + F(3) = 1 + 2 = 3 F(5) = F(3) + F(4) = 2 + 3 = 5 와 같이 이어집니다. 2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요. 제한 사항 n은 2 이상 100,000 이하인 자연수입니다. 입출력 예 n return 3 2 5 5 입출력 예 설명 피보나치수는 0번째부터 0, 1, 1, 2, 3, ..

[Java/자바] 날짜와 시간 (Date, calendar) [내부링크]

Date와 Calendar Date 클래스는 날짜와 시간에 관한 정보를 표현하는 클래스로 JDK 1.0부터 제공되어온 클래스이며 Calendar 클래스는 Date 클래스의 부족한 기능이 추가되어 날짜 연산을 유용하게 할 수 있도록 JDK 1.1부터 제공하기 시작했습니다. Calendar이 Date보다는 훨씬 나았지만 점점 몇가지 단점들이 발견되었고, 후에 JDK 1.8부터 'java.time 패키지'로 기존의 단점들을 개선한 새로운 클래스들이 추가되었습니다. p.s : 두 클래스의 차이점을 알아보니 date와 calendar를 사용함으로써 문제점들이 발생해 많은 사람들이 "Joda-Time"이라는 오픈소스 라이브러리를 사용한다고 합니다. Calendar 객체 생성 Calendar는 추상클래스이기 때문에 ..

[Java/자바] Join과 Split을 이용한 문자열 제어 [내부링크]

Join ( 문자열을 만드는 메서드 ) join 메서드는 문자열 배열이나 List를 파리미터에 입력한 "합칠 문자"와 합쳐진 문자열을 반환합니다. join("합칠 문자", 대상) import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { String[] strArr = {"A", "B", "C", "D"}; List animals = new ArrayList(List.of("고양이", "치타", "코끼리", "호랑이")); System.out.println(String.join(" ", strArr)); System.out.println(String.join("..

[Java/자바] Map에서 value값으로 key찾기 [내부링크]

keySet()을 이용한 방법 keySet() 메서드는 HashMap의 모든 key들을 Set로 리턴합니다. 리턴한 Set의 key로 value를 가져와서, 찾고자하는 value값을 조건식으로 비교하여 해당 value의 key를 찾을 수 있습니다. import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map grade = new HashMap(); grade.put("철수", 100); grade.put("짱구", 30); grade.put("훈이", 60); grade.put("맹구", 20); grade.put("유리", 90); for (String key :..

[Java/자바] 숫자 천자리 구분, 소수점 표기 방법(DecimalFormat) [내부링크]

DecimalFormat 클래스 자바에서는 숫자의 Format을 변경할 수 있는 클래스를 제공하는데, NumberFormat을 상속받는 DecimalFormat클래스를 이용해 천자리마다 구분선을 넣는다던가, 소숫점 몇자리까지 포함할 것인지 정할 수 있습니다. 패턴 의미 0 10진수, 빈자리는 0으로 채운다. # 10진주, 빈자리는 채우지 않는다. . 소수점 표시 , 단위 구분 기호 표시 +, - 음수, 양수 표시 E 지수 문자 ; 양수와 음수 패턴을 모두 사용할 경우 패턴 구분자 % 100을 곱하고 %를 붙인다. \u00A4 통화 표시 \을 붙인다. 예시 코드 import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.L..

[Java/자바] map - getOrDefault의 활용 [내부링크]

getOrDefault(Object key, V DefaultValue) 찾는 key가 존재한다면 찾는 key의 value값을 반환하고, 없다면 DefaultValue를 반환합니다. key map의 key 요소 DefaultValue 지정된 키로 매핑된 값이 없는 경우 반환할 기본 값 예시 코드 import java.util.HashMap; import java.util.Map; public class test { public static void main(String arg[]) { String [] abc = { "A", "B", "C" ,"A", "B"}; Map map = new HashMap(); for(String key : abc) { hm.put(key, hm.getOrDefault(key..

[Java/자바] List와 String(문자열, 배열)을 서로 변환하는 법 [내부링크]

List ↔ String List를 String으로 간단히 변환 join() 메서드 활용 List list = new ArrayList(); String answer = String.join(",",list); String을 List로 변환 split() 메서드 활용 String s = "sample"; String[] strArr = s.split(""); // [s, a, m, p, l, e] ArrayList list = new ArrayList(Arrays.asList(strArr)); String s ="string of words"; String[] strArr = s.split(" "); // [string, of, words] ArrayList list = new ArrayList(Arra..

[Java/자바] 프로그래머스 - 푸드 파이트 대회 [내부링크]

문제 설명 수웅이는 매달 주어진 음식을 빨리 먹는 푸드 파이트 대회를 개최합니다. 이 대회에서 선수들은 1대 1로 대결하며, 매 대결마다 음식의 종류와 양이 바뀝니다. 대결은 준비된 음식들을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로, 다른 선수는 제일 오른쪽에 있는 음식부터 왼쪽으로 순서대로 먹는 방식으로 진행됩니다. 중앙에는 물을 배치하고, 물을 먼저 먹는 선수가 승리하게 됩니다. 이때, 대회의 공정성을 위해 두 선수가 먹는 음식의 종류와 양이 같아야 하며, 음식을 먹는 순서도 같아야 합니다. 또한, 이번 대회부터는 칼로리가 낮은 음식을 먼저 먹을 수 있게 배치하여 선수들이 음식을 더 잘 먹을 수 있게 하려고 합니다. 이번 대회를 위해 수웅이는 음식을 주문했는데, 대회의 조건..

[Java/자바] 프로그래머스 - 체육복/Greedy(탐욕법) 알고리즘 [내부링크]

문제 설명 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다. 전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를..

[Java/자바] 정규식(Regular Expression) 사용법 총정리 [내부링크]

정규식이란 텍스트 데이터 중에서 원하는 조건(Pattern)과 일치하는 문자열을 찾아 내기 위해 사용하는 것으로, 정규식을 이용하면 많은 양의 텍스트 파일 중에서 원하는 데이터를 손쉽게 뽑아낼 수도 있고, 입력된 데이터가 형식에 맞는지 체크할 수 도 있습니다. java.util.regex패키지 public static void main(String[] args) { String[] data = {"bat", "baby", "bonus", "cA", "ca", "co", "c.", "c0", "car", "combat", "count", "date", "disc"}; Pattern p = Pattern.compile("c[a-z]*"); // c로 시작하는 소문자영단어 for (int i = 0; i < ..

자바 코딩 컨벤션(Java Code Conventions) [내부링크]

Code Conventions(코딩 규칙)을 왜 알아야 할 까 ? 개발하는 과정 속에서 구현하는 비용보다 유지보수의 비용이 더 크게 들어가는데 프로젝트나 소프트웨어 개발을 하면서 작성한 코드를 나만 보는 것이 아니라 참여한 모든 개발자들이 보게 됩니다. 하지만 나만의 방식으로 코드를 짰다면 다른 사람들이 봤을 때 이해하기가 힘들겠죠. 예를 들자면 나만의 독특한 글씨체로 글을 쓴 편지를 친구에게 보냈는데 그 친구가 그 편지를 읽는데에 해독이 필요한 것처럼요. 그래서 Code Conventions이 필요합니다. 정해진 Code Conventions에 맞춰 코드를 작성하게 된다면 나 외의 다른 사람들도 코드를 해석하는데 빠르게 이해할 수 있어 지게 되므로 가독성이 좋아지게 됩니다. 이 포스팅에서 설명할 컨벤션..

[Java/자바] Enum(열거형)이란? [내부링크]

열거형은 서로 연관된 상수를 편리하게 선언하기 위한 것으로, 여러 상수를 정의할때 사용하기 좋습니다. 서로 연관된 상수라 함은 아래의 간단한 예시 코드처럼 DOOR와 WHEEL은 String 타입으로 서로 연관된 상수라 할 수 있습니다. enum Car { DOOR("4개의 문을 가진 차"), WHEEL("자동차의 바퀴"); } 열거형의 정의와 사용 아래 처럼 중괄호{}안에 상수의 이름을 나열하기만 하면 됩니다. enum 열거형이름 { 상수명1, 상수명2, .... } 이 열거형에 정의된 상수를 사용하는 방법은 "열거형이름.상수명"으로 클래스의 static 변수를 참조하는 것과 동일합니다. 또한 열거형 상수간의 비교에는 "eqauls()와 "=="를 사용할 수 있는데, ""와 같은 비교연산자는 사용할 수..

[Java/자바] 프로그래머스 - 소수 찾기 (에라토스테네스의 체) [내부링크]

문제 설명 1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상 1000000이하의 자연수입니다. 입출력 예 n result 10 4 5 3 Solution.java public int solution(int n) { int answer = 0; // 0 ~ n 까지의 수를 가지는 배열 생성 int[] arr = new int[n + 1]; // 소수 중 제일 작은 수는 2이므로 2부터 시작한다. for (int i = 2; i

[Java/자바] JUnit5 Assertions 예제 정리 [내부링크]

이번 포스팅에선 JUnit5의 Assertions으로 테스트 코드 작성하는 법에 대해 알아보고자 합니다. JUnit5의 어노테이션과 메서드들은 아래 링크에 설명해놨으니 참고 하시면 됩니다. [Java/자바] JUnit5란? JUnit5 이란 ? Java 개발자가 가장 많이 사용하는 테스팅 프레임워크로, JAVA 8 버전부터 사용 가능하며 테스트 주도 개발(TDD, Test Driven Development)을 위해 사용됩니다. 요구사항을 검증하는 테스트 케 hstory0208.tistory.com JUnit 5 Assertions assertArrayEquals 예상 배열(expected)과 실제 배열(actual))이 동일한지 확인합니다. 두 배열이 일치 하지 않다면, 마지막 인자인 메세지가 출력됩니다..

[우아한테크코스 백엔드 5기] 프리코스 4주차 후기 (다리 건너기) [내부링크]

4주간 진행되었던 프리코스 마지막을 장식할 미션은 바로 다리 건너기 게임입니다. 기능 요구 사항은 아래와 같으며 마지막 요구사항인 만큼 추가된 요구사항들이 정~~말 많았는데요 그 만큼 새로 느끼고 배우는 점들도 많았고 요구사항들에 맞춰 리팩토링 하는 재미가 쏠쏠했었습니다 ㅎㅎ 4주차 다리 건너기 미션 : https://github.com/SuhHyeonjun/java-bridge 직접 작성한 코드 : https://github.com/woowacourse-precourse/java-bridge/pull/131 이번 4주차의 목표는 요구사항도 많아 졌고, 이전 미션들에서 받았던 피드백들을 합쳐서 좀 많았습니다 확실히 이렇게 목표 체크리스트를 만들고 나니 과제를 완성한 후 목표를 하나씩 지켰는지 확인하는 과..

[우아한테크코스 백엔드 5기] 프리코스 3주차 후기 (로또) [내부링크]

안녕하세요 ~ 2주차 후기 이후로 오랜만에 포스팅하네요 하하.. 이번 3주차 미션의 난이도도 어렵기도 했고 욕심을 가지고 하다보니 포스팅 할 시간이 부족하더라구요 아직 정리 할 내용들이 산더미 처럼 많은데 마지막 프리코스가 끝나고 폭풍 정리 시작해야겠습니다 c 제가 작성한 코드는 이곳을 클릭하여 보실 수 있습니다. 프리코스 3주차 - 로또 미션 이번 3주차 미션은 로또 미션이였는데요 2주차 미션의 요구사항에서 다음과 같이 요구사항이 추가되었습니다. 그리고 다음과 같이 미리 작성된 Lotto 클래스를 이용하여 로또 게임을 구현하는 제한사항이 주어졌습니다. 로또 게임을 완성한 후 실행 결과 예시입니다. 구입금액을 입력해 주세요. 8000 8개를 구매했습니다. [8, 21, 23, 41, 42, 43] [3..

[Java/자바] 람다식(Lambda)이란? 그리고 사용법 [내부링크]

람다식이란 ? 람다식이란 쉽게 말해 메서드를 "하나의 식"으로 표현한 것입니다. 하나의 식으로 표현하여 훨씬 간략하게 표현이 가능하게 되며, 메서드의 이름과 반환값이 없어지므로 "익명함수"라고도 합니다. int[] arr = new int[5] Arrays.setAll(arr, (i) -> (int) (Math.random() * 5) + 1); // (i) - (int) (Math.random() * 5) + 1 람다식을 메서드로 표현 int method() { return (int) (Math.random() * 5) + 1; } 위 코드에서는 int배열 arr에 setAll의 두 번째 인자로 채우는 코드를 가지고 있습니다. (i) -> (int) (Math.random() * 5) + 1 가 람다식..

MVC 디자인 패턴이란? [내부링크]

MVC란 ? MVC 패턴의 등장 하나의 서블릿이나 JSP만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리하게 되면, 너무 많은 역할을 하게됩니다. 그렇게 되면 비즈니스 로직을 호출하는 부분에 변경이 발생해도 해당 코드를 손대야 하고, UI를 변경할 일이 있어도 비즈니스 로직이 함께 있는 해당 파일을 수정해야 하기 때문에 유지보수가 어려워집니다. HTML 코드 하나 수정하거나 비즈니스 로직하나를 수정하는데, 수백 수천줄의 HTML코드나 자바 코드가 함께 있다면 정말 지옥일 겁니다 c 그래서 이러한 문제를 해결하고자 MVC 패턴이 등장하게 되었습니다. MVC 는 Model - View - Controller의 약자로, 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 3가지로 구분한 패턴입니다. Mod..

[우아한테크코스 백엔드 5기] 프리코스 2주차 후기 (숫자 야구 게임) [내부링크]

드디어 본격적인 시작을 알리는 2주차가 시작되었습니다 ! 2주차는 1주차에서 배운 점들을 최대한 적용하여 과제를 진행하기 위해 다음과 같이 2주차 목표를 세웠습니다. 저는 제 나름대로 이 목표들을 다 달성해서 제출했다고 생각하지만 과연 이 목표대로 이번 과제를 잘 했는지 결과가 궁금하네요 cc 이번 2주차 숫자 야구 게임 역시 배우고 느낀 점들이 참 많았는데요. 그 내용들에 대해 하나씩 정리해보자 합니다. 새롭게 배운 것과 느낀 점들 인텔리제이 사용 1주차는 이때까지 자바의 정석을 독학하면서 이클립스를 사용해 익숙한 이클립스를 사용했었습니다. 그리고 이클립스와 인텔리제이의 차이점을 검색했을 때 이클립스는 무료인 반면 인텔리제이는 유료라는 말이 있었기 때문에 이클립스를 사용하고 있기도 했었습니다. 하지만 ..

[Java/자바] 접근제어자(Access Modifier)란? [내부링크]

접근 제어자는 멤버 또는 클래스에 사용하여 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 합니다. 만약 멤버 또는 클래스 앞에 접근 제어자가 지정되어 있지 않다면, 접근 제어자가 default임을 뜻합니다. 주의할 점으로 하나의 소스파일(*.java)에는 public 클래스가 단 하나만 존재할 수 있으며, 소스파일의 이름은 반드시 public 클래스의 이름과 같아야 합니다. 접근 제어자를 사용하는 이유는 다음과 같습니다. 외부로부터 데이터를 보호하기 위해 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해 접근 제어자가 사용될 수 있는 곳 클래스 멤버변수 메서드 생성자 접근 제한자의 사용 범위 public : 접근 제한이 전혀 없다. protected : 같은 패키지 ..

[Java/자바] JUnit5란? [내부링크]

JUnit5 이란 ? Java 개발자가 가장 많이 사용하는 테스팅 프레임워크로, JAVA 8 버전부터 사용 가능하며 테스트 주도 개발(TDD, Test Driven Development)을 위해 사용됩니다. 요구사항을 검증하는 테스트 케이스 작성 테스트 통과를 위한 코드 작성 이후 작성된 테스트 케이스 실행 테스트 케이스 오류가 나는 부분을 찾아 리팩토링하여 실제 개발 코드에 적용 JUnit 모듈 구성 JUnit 5는 크게 3개의 요소로 구성되어 있습니다. JUnit Platform 테스트를 발견하고 계획을 생성하고 결과를 보고하는 TestEngine 인터페이스를 정의합니다. 테스팅 프레임워크를 구동하기 위한 런처와 테스트 엔진을 위한 API를 제공 JUnit Jupiter Junit5 TestEngin..

[Java/자바] Stream 변환 표 [내부링크]

Stream 기본형 Stream From To 변환 메서드 Stream IntStream LongStream DoubleStream mapToInt(ToIntFunction mapper) MapToLong(ToLongFunction mapper) MapToDouble(ToDoubleFunction mapper) 기본형 Stream Stream From To 변환 메서드 IntStream LongStream DoubleStream Stream Stream Stream boxed() Stream mapToObj(DoubleFunction mapper) 기본형 Stream 기본형 Stream From To 변환 메서드 IntStream LongStream DoubleStream LongStream ..

[우아한테크코스 백엔드 5기] 프리코스 1주차 회고 (온보딩) [내부링크]

경험이 많이 없는 저는 대체 뭘 공부해야 하고 어떻게 준비하고 어떤 경험들을 해야 좋은회사에 들어갈 수 있는지에 대해 전혀 몰랐습니다. 그래서 여러 검색들을 통해 많은 사람들이 추천하는 책을 사서 실습해보고 최대한 github을 많이 이용하면서 새롭게 배운 지식들을 정리하고, 복습하며 독학하고 있었습니다. 공부하면서 글로는 이해가 안되는 개념들은 주로 영상을 통해 이해하는 편인데요. 그중 유튜브 테코톡을 자주 애용했었기 때문에 우아한테크코스가 무엇인지는 알고 있었고, 우아한테크코스에 대해 알아보기도 하였었습니다. 그 당시 알아봤을 때는 비전공자는 지원할 수 없는 영역의 교육인지 알았었는데, 이번 우아한테크코스 5기 일정이 나오게 되면서 보니 비전공자도 지원이 가능했었습니다! 그래서 우아한테크코스5기 백엔..

[Java/자바] Stream(스트림)이란? 사용법 총정리 [내부링크]

자바에서는 많은 양의 데이터를 저장하기 위해서 배열이나 컬렉션을 이용합니다. 이렇게 저장된 데이터에 접근하기 위해서는 반복문이나 반복자(iterator)를 사용하여 매번 새로운 코드를 작성해왔습니다. 하지만 이러한 방식으로 작성된 코드는 너무 길고 가독성도 떨어지며 코드의 재사용도 떨어집니다. 또 다른 문제는 데이터 소스마다 다른 방식으로 다뤄야한다는 점입니다. Collection이나 Iterator와 같은 인터페이스의 각 컬렉션 클래스에는 같은 기능의 메서드들이 중복해서 정의되어 있습니다. 예를 들면, List를 정렬할 때는 Collections.sort()를 사용하고, 배열을 정렬할 때는 Arrays.sort()를 사용한다는 점입니다. 이러한 문제를 극복하기 위해 나온 것이 바로 Stream입니다. ..

[Java/자바] 제네릭스(Generics)란 ? [내부링크]

컬렉션 클래스들 타입 다음에 , , 등으로 붙여진 형식들을 많이 보셨을건데, 이게 바로 제네릭스입니다. 제네릭스란 클래스가 가질 타입을 미리 명시해줌으로써 제네릭스를 사용한 클래스의 객체가 형변환을 하지 않고 사용할 수 있도록 해줍니다. 하지만 만약 List list = new ArrayList(); 로 제네릭스를 명시했는데 이 list 객체에 Integer 타입을 넣게 된다면 컴파일 에러가 발생하므로 제네릭스를 정하면 그 제네릭스에 맞는 타입을 사용해야 합니다. 제네릭스의 장점 1. 타입의 안정성을 제공한다. 2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해진다. 대표적인 제네릭스의 타입 타입 제네릭스는 Object로 모든 종류의 타입을 지정 가능 합니다. 타입 설명 Object Element..

[Java/자바] HashSet과 HashMap의 차이점 [내부링크]

HashSet과 HashMap의 차이점 HashSet과 HashMap을 공부하다보면 이런 의문이 들 것입니다. 비슷한거 같은데 대체 뭐가 다르지 ? 이번에 이 두 컬렉션 클래스들을 정리하면서 의문이 들었기에 이번 포스팅에서는 차이점을 비교해 보려 합니다. HashSet과 HashMap 비교 표 HashSet HashMap 구현 Set의 구현체 Map의 구현체 중복허용 여부 객체 자체를 데이터로 저장하기 때문에 중복 X key는 중복을 허용 X value는 중복을 허용한다. 데이터 저장 객체(Object)만 저장할 수 있다. 내부적으로 HashMap을 사용하기 때문에 삽입되는 객체(Key값)와 dummy 객체(Value 값), 삽입 연산 동안 총 두 개의 객체가 생성 데이터를 key-value 쌍 형식으로..

[Java/자바] 배열(Array)을 리스트(List)로 변환 [내부링크]

이번 포스팅에선 배열 [ ] 을 List로 변환하는 방법을 설명하고자 합니다. 이 내용을 이해하기 위해선 기본형과 참조형에 대한 이해가 필요합니다. 기본형과 참조형에 대해 알고 싶으시다면 아래 포스팅을 참고하시면 됩니다. Java - 변수의 타입 (기본형과 참조형) data의 type 우리가 주로 사용하는 값 ( data ) 의 종류 ( type )은 크게 "문자와 숫자"로 나눌 수 있으며, 숫자는 다시 "정수와 실수"로 나눌 수 있습니다. 이런 값( data )의 종류 ( type )에 따라 값이 저장 hstory0208.tistory.com String[ ] ↔ List로 변환 String[ ]배열을 List로 변환 import java.util.*; import java.util.Arrays; pu..

[Java/자바] TreeSet 사용법 [내부링크]

TreeSet은 이진 검색 트리(binary search tree)라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스입니다. 이진 검색 트리는 정렬, 검색, 범위검색(range search)에 높은 성능을 보이며 TreeSet은 이진 검색 트리의 성능을 향상시킨 "레드-블랙 트리(Red-Black tree)"로 구현되어 있습니다. 그리고 Set 인터페이스를 구현했으므로 중복된 데이터의 저장을 허용하지 않고, 저장순서를 유지하지 않습니다. 이진 트리는 LinkedList처럼 여러 개의 노드(node)가 서로 연결된 구조로, 각 노드에 최대 2개의 노드를 연결할 수 있으며, "루트(root)"라고 불리는 하나의 노드에서 시작해 계속 확장해 나갈 수 있습니다. 위 아래로 연결된 두 노드를 "부모 - 자식 ..

[Java/자바] HashMap 클래스 사용법 [내부링크]

HashMap은 Map 인터페이스를 구현하여 Map의 특징 키(key)와 값(value)를 묶어서 하나의 데이터(entry)로 저장한다는 특징을 가집니다. 그리고, 해싱(hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보여줍니다. HashMap은 키와 값을 각각 Object타입으로 저장합니다. 즉 (Object, Object)의 형태로 저장하기 때문에 어떤 객체도 저장할 수 있지만, 키는 주로 String을 대문자 또는 소문자로 통일해 사용합니다. 키(key) : 컬렉션 내의 키(key) 중에서 유일해야 한다. ( 중복을 허용하지 않는다 ) 값(value) : 키(key)와 달리 데이터의 중복을 허용한다. 키만 중복을 왜 허용하지 않는지에 대한 예로, 아이디와 비밀번..

[Java/자바] HashSet 클래스 사용법 [내부링크]

HashSet HashSet은 Set인터페이스를 구현한 가장 대표적인 컬렉션으로, 중복된 요소를 저장하지 않습니다. 그렇기 때문에 HashSet에 이미 저장되어 있는 요소를 추가하고자 한다면 객체를 저장하기 전에, 먼저 객체의 hashCode()메소드를 호출해서 해시 코드를 얻어낸 다음 저장되어 있는 객체들의 해시 코드와 비교한 뒤 같은 해시 코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않습니다. ArrayList와 달리 저장순서를 유지하지 않기 때문에, 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야합니다. HashSet 선언 import java.util.HashSet; HashSet set = new Ha..

[Java/자바] Comparator와 Comparable [내부링크]

Comparable과 Comparator는 인터페이스로 실제 소스는 다음과 같습니다. public interface comparable { public int compareTo(Object o1, Object o2); } public interface comparator { int compare(Object o1, Object o2); boolean equals(Object obj); } 인터페이스이기에 Comparable이나 Comparator을 사용하고자 한다면 인터페이스 내에 선언된 메소드를 반드시 구현해야합니다. compareTo()와 compare()는 선언형태와 이름이 약간 다를 뿐 두 객체를 비교한다는 같은 기능을 목적으로 만들어졌습니다. compareTo() 반환값은 int이지만, 실제로는..

[Java/자바] Collections 클래스 [내부링크]

Collections는 클래스로 Collection 인터페이스와 다릅니다. Collections 클래스 안의 메서드들은 static이기 때문에 인스턴스를 생성하지 않고 바로 사용 가능합니다. Collections 클래스는 Collection 인터페이스로 구현한 클래스들에 대한 객체생성, 정렬(sort), 병합(merge), 검색(serch) 등의 기능을 수행하도록 도와주는 클래스입니다. Collection 인터페이스로 구현한 클래스에 대한 설명은 아래 포스팅을 통해 알 수 있습니다. [Java/자바] 컬렉션 프레임워크(Collections Framework) 컬렉션 프레임워크란 "다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미" 합니다. 즉, 데이터를 저장하..

[Java/자바] Iterator, Listlterator 클래스 사용법 [내부링크]

Iterator iterator()는 Collection 인터페이스에 정의된 메서드로, Collection 인터페이스의 자손인 List와 Set에도 포함되어 있습니다. 그래서 List나 Set인터페이스를 구현하는 컬렉션은 iterator()가 각 컬렉션의 특징에 맞게 포함되어 있습니다. Map 인터페이스를 구현한 클래스의 경우에는 key - value 쌍으로 저장하기 때문에 iterator()를 직접호출 할 수 없고, keySet()이나 entrySet() 메서드를 통해 키와 값을 Set형태로 얻은 뒤 iterator()를 호출할 수 있습니다. Map map = new HashMap(); Iterator it = map.entrySet().iterator(); iterator() 메서드는 반복문, 주로 ..

[Java/자바] LinkedList 클래스 사용법 [내부링크]

기본적인 형태의 배열 ( array )는 구조가 간단하여 사용하기가 쉽고, 데이터를 읽어오는데 걸리는 시간이 가장 빠르다는 장점을 가지고 있습니다. 하지만 아래와 같은 단점도 가지고 있습니다. Array ( 배열 ) 의 단점 1. 크기를 변경할 수 없다. 크기를 변경할 수 없기 때문에 새로운 배열을 생성해서 데이터를 복사해야한다. 2. 메모리 낭비 실행속도를 향상시키기 위해선 충분히 큰 크기의 배열을 생성해야 하므로 메모리가 낭비된다. 3. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다. 차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것은 빠르지만, 배열의 중간에 데이터를 추가하려면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야한다. LinkedList는 이러한 단점을 ..

[Java/자바] ArrayList 클래스 사용법 [내부링크]

ArrayList ArrayList는 List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 특징을 가집니다. Object배열을 이용해 데이터를 순차적으로 index는 0부터 시작하고 그 다음은 1,2,3 ~ 순으로 저장됩니다. 만약 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음 저장됩니다. 또한 선언된 배열의 타입이 모든 객체의 최고조상인 Object이기 때문에 모든 종류의 객체를 담을 수 있습니다. ArrayList 선언 import java.util.ArrayList; ArrayList arraylist1 = new ArrayList(); ArrayList arraylist2 = new Arra..

[알고리즘] 유클리드 호제법 - 최소공배수, 최대공약수 구하기 [내부링크]

유클리드 호제법 유클리드 호제법이란, 두 개의 수가 주어졌을 때, 최대공약수를 구하는 알고리즘입니다. 최소공배수는 주어진 두 개의 수를 곱한 값을, 그 두 개의 수의 최대공약수로 나누어 구할 수 있습니다. 최대공약수 : GCD(greatest common divisor) 최소공배수 : LCM(largest common multiple) 유클리드 호제법으로 최대공약수를 구하는 원리 1980과 168의 최소공배수를 유클리드 호제법을 이용하면 다음과 같은 과정을 거치게 됩니다. 1. 1980을 168로 나눕니다. 2. 1980을 168로 나눈 나머지 132와 168을 다시 나눕니다. 3. 168을 132로 나눈 나머지 36과 132를 다시 나눕니다. 4. 나머지가 0이 될때까지 반복합니다. 5. 나머지가 0이..

[Java/자바] 컬렉션 프레임워크(Collections Framework) [내부링크]

컬렉션 프레임워크란 "다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미" 합니다. 즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것입니다. 또한, 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있어 재사용성이 높은 코드를 작성할 수 있고, 다수의 데이터를 다루는데 필요하고 다양하고 풍부한 클래스들을 제공하여 프로그래머들에게 편리함을 제공해줍니다. 컬렉션 프레임워크 핵심 인터페이스 컬렉션 프레임워크에서는 데이터를 저장하는 자료 구조에 따라 다음과 같은 3가지 타입이 존재 합니다. 그리고 인터페이스 List와 Set의 공통된 부분을 뽑아서 새로운 인터페이스인 Collection을 추가로 정의하였습니..

[Java/자바] 스택(Stack)과 큐(Queue) [내부링크]

스택(Stack)과 큐(Queue)를 설명하기 앞서 간단하게 알아봅시다. Stack은 LIFO(Last In First Out) 구조로 되어 있으며, 쉽게 해석하면 "후입 선출" 입니다. 즉, 마지막(최근)에 넣은 것을 먼저 뺀다는 말이죠. Queue는 FIFO(First IN First Out) 구조로, Stack과 반대로 "선입 선출" 입니다. 아르바이트하면서 냉장고에 재고 채워넣을 때 선입선출이란말 자주 들어보셨죠 ? 즉, 먼저 넣은 것(오래된 것)을 먼저 뺀다는 말입니다. 스택(Stack)과 큐(Queue) 비교 코드 import java.util.Stack; import java.util.LinkedList; import java.util.Queue; class StackQueueEx { pub..

[Java/자바] Math 클래스 정리 (feat.삼각함수) [내부링크]

Math클래스는 기본적인 수학계산에 유용한 메서드로 구성되어 있습니다. 이번 포스팅을 통해 Math클래스의 자주 사용되는 메서드에 대해 다뤄볼 것이며 삼각함수 구하는 법도 다뤄보려 합니다. Math 클래스 Math.abs() 주어진 값의 절대값을 반환합니다. public class MathTest { public static void main(String[] args) { int i = Math.abs(-2); double d = Math.abs(-4); System.out.println(i); System.out.println(d); } } Math.sqrt() - ( double형으로 반환 ) 주어진 값의 제곱근 값을 반환합니다. public class MathTest { public static v..

[Java/자바] 인터페이스(interface)란 ? [내부링크]

인터페이스란 ? 인터페이스는 일종의 추상클래스로, 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없습니다. 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용되지 않습니다. 추상 클래스를 부분적으로만 완성된 "미완성 설계도"라고 한다면, 인터페이스는 구현된 것은 아무것도 없는 그냥 스케치만 되어 있는 "기본 설계도"라 할 수 있습니다. 인터페이스의 특징 다중 상속이 가능하다. 추상 메서드와 상수만을 가진다. 생성자 생성이 불가능하다. 메서드 오버라이딩이 필수적이다. 인터페이스의 장점 1. 개발시간을 단축시킬 수 있다. 인터페이스를 통해 메서드를 호출하는 쪽에서는 메서드의 내용과 관계없이..

[Java/자바] StringBuffer 클래스 사용법 [내부링크]

String 클래스는 immutable(불변) 불변성을 가졌기 때문에 String 객체를 변경시 실제로 변경되는 것이 아닌 새로운 String 객체를 생성합니다. 즉, 지정된 문자열을 변경할 수 없습니다. 반면 StringBuffer/StringBuilder 클래스는 mutable(가변) 가변성을 가져, 동일한 객체내에서 문자열 변경이 가능합니다. StringBuffer/StringBuilder 클래스의 차이점 StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있습니다. 그래서 멀티쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어트리게 됩니다. 그래서 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder 가 추가되었습니다. Str..

[Java/자바] String 클래스의 생성자와 메서드 [내부링크]

아래의 표는 String클래스 내에 정의된 생성자의 메서드의 목록입니다. 자바의 정석3을 참고해 자주사용되는 것들만을 표로 적었습니다. 메서드/설명 예 제 결 과 String (String s) 주어진 문자열 (s)을 갖는 String 인스턴스를 생성 String s = new String("HI?"); s="HI?" String(char[] value) 주어진 문자열(value)을 갖는 String인스턴스를 생성 char[] c = {'H','e','l','l','o'} String str = new String(c) s= "Hello" String(StringBuffer buf) StringBuffer 인스턴스가 갖고 있는 문자열과 같은 내용의 String인스턴스를 생성 StringBuffer sb ..

객체지향프로그래밍 (OOP)에 대해 알아보자. [내부링크]

객체지향프로그래밍 ( Object Oriented Programming ) 이란 ? 먼저 OOP를 이해하기 위해선 절차지향적 프로그래밍에 대해 알아야하는데요, 절차 지향 프로그래밍 ( PP : Procedural Programming )에 대해 설명하자면, 순차적인 처리를 중요시하며, 프로그램 전체가 유기적으로 연결되어 있습니다. 그렇기 때문에 프로그램을 이해하기 어렵고 유지보수가 어렵다는 등의 단점이 있지만 속도가 빠르다는 장점이 있습니다. OOP는 위와 같은 절차지향적 프로그래밍의 단점을 보완하기 위해서 만들어졌습니다. 객체란 "실제로 존재하는 것"으로 우리가 주변에서 볼 수 있는 책상, 의자, 컴퓨터와 같은 사물들을 곧 객체라고 할 수 있습니다. 이처럼, 객체지향프로그래밍 ( OOP )은 현실 세계..

[Java/자바] 다형성(polymorphism)이란 ? [내부링크]

다형성 다형성은 객체지향 언어인 자바의 아주 중요한 특징 중 하나입니다. 다형성은 상속과 깊은 관계를 가지고 있으므로 상속에 대해 알고 싶다면 아래 포스팅을 참고하시면 됩니다. [Java/자바] 클래스의 관계 - 상속(is-a)과 포함(has-a) 상속 상속이란, 기존의 클래스를 재사용해 새로운 클래스를 작성하는 것입니다. 상속을 통해서 클래스를 작성하면, 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리 hstory0208.tistory.com 다형성이란, "여러 가지 형태를 가질 수 있는 능력"을 의미하며 자바에서 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현합니다. 쉽게 말하면, "조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 ..

[Java/자바] 추상 클래스와 추상 메서드란 (abstract)? [내부링크]

추상이란 ? 추상의 사전적 의미를 보면 "여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용." 입니다. "상속"이 자손 클래스를 만드는데 조상 클래스를 사용하는 것이라면, "추상화"는 기존의 클래스의 공통적인 부분을 뽑아 조상 클래스를 만드는 것이라 할 수 있습니다. 추상화 : 클래스간의 공통점을 찾아 공통의 조상을 만드는 작업. 구체화 : 상속을 통해 클래스를 구현, 확장하는 작업. 상속계층도를 따라 내려갈수록 클래스는 점점 기능이 추가되어 구체화의 정도가 커져 세분화되고, 반대로 올라갈수록 추상화의 정도가 커져 공통요소만 남게됩니다. 추상 클래스 ( abstract class ) 클래스를 설계도라 비유한다면, 추상클래스는 미완성 설계도라고 할 수 있습니다. 클래스가 미..

[Java/자바] Super와 Super() [내부링크]

super super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수입니다. 멤버변수와 지역변수의 이름이 같을 때 this를 붙여 구별했듯이 상속받은 멤버와 자신의 멤버와 이름이 같을 때는 super를 붙여 구분할 수 있습니다. super와 this 비교 class SuperTest { public static void main(String args[]) { Child c = new Child(); c.method(); } } class Parent { int x=10; } class Child extends Parent { int x = 20; void method() { System.out.println("x=" + x); System.out.println("this...

[Java/자바] 오버라이딩(overriding)이란 ? [내부링크]

오버라이딩 ( overriding ) 오버라이딩이란, 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 말합니다. 상속받은 메서드를 그대로 사용해도 되지만, 자손 클래스에 맞게 변경해야할 경우 오버라이딩을 사용합니다. 오버라이딩의 조건 오버라이딩이 성립되기 위해서는 다음과 같은 조건들을 만족해야 합니다. 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 1. 이름이 같아야 한다. 2. 매개변수가 같아야 한다. 3. 반환타입이 같아야 한다. 요약하면 선언부가 서로 일치해야 한다는 것과 같습니다. 오버라이딩 예시 class Point { int x; int y; String getLocation() { return "x :" + x + ", y :" + y; } } class Point3..

[Java/자바] 클래스의 관계 - 상속(is-a)과 포함(has-a) [내부링크]

상속 상속이란, 기존의 클래스를 재사용해 새로운 클래스를 작성하는 것입니다. 상속을 통해서 클래스를 작성하면, 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 도 있어 코드의 추가 및 변경이 용이합니다. 상속 방법 상속 방법은 아주 간단하게 상속받고자 하는 클래스의 이름 앞에 "extends"를 붙여주면 됩니다. 만약 새로 작성하고자 하는 클래스의 이름이 "Child"이고 상속받고자 하는 기존 클래스의 이름이 "Parent"라면 다음과 같습니다. class Child extends Parent { ... } 이 두 클래스는 서로 상속관계에 있다고 하며, 상속해주는 클래스를 "조상 클래스", 상속 받는 클래스를 "자손 클래스"라고 합니다. 이 상속관계를 그림으로 표현하면 다음..

[Java/자바] 멤버변수 초기화 방법 (명시적 초기화, 초기화 블럭) [내부링크]

아래의 포스팅을 통해 멤버변수가 무엇인지, 지역변수가 무엇인지에 대해 알아보았습니다. (Java/자바) 클래스 변수, 인스턴스 변수, 지역 변수란? 이 글을 읽기 앞서 자바의 클래스와 객체란? 인스턴스란 ? 무엇인지 모른다면 아래 포스팅을 참고하시면 좋습니다. (Java/자바) 클래스와 객체 클래스와 객체 클래스와 객체를 설명하는 예시로 여 hstory0208.tistory.com 다시 한번 간단하게 복습하자면 다음과 같습니다. 멤버변수(클래스변수, 인스턴스변수)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다. 이번 시간에는 멤버변수의 초기화의 방법들에 대해 알아보고자 합니다. 멤버변수의 초기화 방법으로는 총 3가지가 있습니다. 명시적 초기화 생성자 초기화 블럭 - 인스턴스 초기화 블럭,..

[Java/자바] 생성자( Constructor )란 ? [내부링크]

생성자 ( Constructor ) 생성자는 new 연산자를 통해 인스턴스가 생성될 때 호출되고 제일 먼저 실행되는 "인스턴스 초기화 메서드" 입니다. 어떻게 보면 메서드와 비슷해보이지만 생성자는 단순히 인스턴스 변수들의 초기화에 사용되는 조금 특별한 메서드입니다. 생성자 역시 메서드처럼 클래스 내에 선언되며, 구조도 메서드와 유사하지만 리턴값 (return)이 없다는 점이 다릅니다. 그렇다고 해서 리턴값이 없음을 뜻하는 void를 사용하지는 않습니다. 생성자의 조건 1. 생성자의 이름은 클래스의 이름과 같아야 한다. 2. 생성자는 리턴 값이 없다. 생성자 선언 방법 생성자는 다음과 같이 정의합니다. 생성자도 오버로딩이 가능하므로 하나의 클래스의 여러 개의 생성자가 존재할 수 있습니다. 클래스이름 (타입..

[Java/자바] 오버로딩 (overloading)이란 ? [내부링크]

오버로딩(Overloading)이라는 뜻은 사전적으로 '과적하다.'라는 뜻으로, 오버로딩이란 ? 한 클래스 내에서 같은 이름의 메서드를 여러 개 정의하는 것을 말합니다. 오버로딩의 조건 오버로딩이 성립되기 위해선 다음과 같은 조건을 만족해야합니다. 1. 메서드 이름이 같아야 한다. 2. 매개변수의 개수 또는 타입이 달라야 한다. 비록 메서드의 이름이 같더라도 매개변수가 다르면 서로 구별될 수 있기 때문에 오버로딩이 가능합니다. 위의 조건을 만족시키지 못할시에는, 메서드가 중복으로 간주되어 컴파일 시 에러가 발생합니다. 주의할 점으로는 반환 타입( 리턴 타입 )은 오버로딩을 구현하는데 아무런 영향을 주지 않습니다. 오버로딩 예시 코드 아래 코드는 전부 오버로딩의 조건을 만족합니다. class Overloa..

[Java/자바] 클래스(static) 메서드와 인스턴스 메서드 [내부링크]

클래스 변수와 인스턴스 변수에서도 그랬듯이, 메서드 앞에 static이 붙으면 클래스 메서드, 없으면 인스턴스 메서드 입니다. 클래스 메서드도 클래스 변수처럼, 객체를 생성하지 않고도 "클래스이름.메서드이름(매개변수)"와 같은식으로 호출이 가능합니다. 반면에, 인스턴스 메서드는 반드시 객체를 생성해야만 호출이 가능합니다. (Java/자바) 클래스 변수, 인스턴스 변수, 지역 변수란? 이 글을 읽기 앞서 자바의 클래스와 객체란? 인스턴스란 ? 무엇인지 모른다면 아래 포스팅을 참고하시면 좋습니다. (Java/자바) 클래스와 객체 클래스와 객체 클래스와 객체를 설명하는 예시로 여 hstory0208.tistory.com 인스턴스 메서드 인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을..

[Java/자바] 재귀호출이란 ? [내부링크]

재귀호출이란 ? 메서드의 내부에서 메서드 자신을 다시 호출하는 것을 말합니다. 그리고 재귀호출을 하는 메서드를 "재귀 메서드"라고 합니다. void method() { method(); // 재귀호출. 메서드 자신을 호출한다. } 그런데 오로지 재귀호출뿐이라면, 무한히 자기 자신을 호출하기 때문에 무한 반복에 빠지게 됩니다. 무한반복문이 조건문과 함께 사용되어야 하는 것처럼, 재귀호출도 조건문이 필수적으로 따라다닙니다. void method(int n) { if(n==0) return; // n의 값이 0이라면 메서드 종료. System.out.println(n); method(--n); // 재귀호출. } 반복문보다 재귀호출이 더 빠른가 ? 결론부터 말하면 아닙니다. 메서드를 호출하는 것은 반복문보다 ..

[Java/자바] 메서드(Method)란 ? [내부링크]

메서드 ( Method ) 메서드란 특정 작업을 수행하는 문장들을 하나로 묶은 것으로 수학의 함수와 비슷합니다. 대표적으로 절댓값을 구하는 메서드 Math.abs(-3)을 실행하면 3의 결과를 반환합니다. 메서드를 사용하는 이유 1. 높은 재사용성 ( reusability ) 이미 자바 API에서 제공하는 메서드들을 사용하면서 코딩의 편리함을 느끼실 겁니다. 이렇게 메서드를 한번 만들어 놓으면 몇 번이고 호출할 수 있으며, 다른 프로그램에서도 사용이 가능합니다. 2. 중복된 코드의 제거 프로그램을 작성하다 보면, 같은 내용의 문장들이 중복되곤 합니다. 이렇게 반복되는 문장들을 묶어 하나의 메서드로 작성해 놓으면, 중복을 제거하고 메서드를 호출함으로써 대체할 수 있습니다. public static void..

[Java/자바] 클래스와 객체 [내부링크]

클래스와 객체 클래스와 객체를 설명하는 예시로 여러 예시가 있습니다. 게임 비유 : 클래스(직업)에 따라 클래스(직업)에 맞는 아이템과 동작들이 주어져서 객채가 생성되는 것. 붕어빵 비유 : 클래스라는 모형틀(붕어빵틀)을 만들고 팥을 넣고 구워 객채(붕어빵)를 만든다. 이러한 예시를 보고 클래스와 객체가 무엇인지 아래 설명을 본다면 좀 더 이해가 쉬울 겁니다. 클래스 클래스란 "객체를 정의해놓은 것" 또는 "객체의 설계도 또는 틀"이라고 정의할 수 있습니다. 클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성됩니다. 클래스의 정의 : 객체를 정의해 놓은 것 클래스의 용도 : 객체를 생성하는데 사용 객체 객체는 "실제로 존재하는 것"으로 우리가 주변에서 볼 수 있는 책상, 의자, 컴퓨터..

[Java/자바] 클래스 변수, 인스턴스 변수, 지역 변수란? [내부링크]

이 글을 읽기 앞서 자바의 클래스와 객체란? 인스턴스란 ? 무엇인지 모른다면 아래 포스팅을 참고하시면 좋습니다. (Java/자바) 클래스와 객체 클래스와 객체 클래스와 객체를 설명하는 예시로 여러 예시가 있습니다. 게임 비유 : 클래스(직업)에 따라 클래스(직업)에 맞는 아이템과 동작들이 주어져서 객채가 생성되는 것. 붕어빵 비유 : hstory0208.tistory.com 자바에서 변수는 클래스 변수, 인스턴스 변수, 지역 변수로 모두 3가지의 변수가 있습니다. 그리고 클래스 변수와, 인스턴스 변수를 "멤버변수"라고 합니다. class test { int a; // 인스턴스 변수 static int b;// 클래스 변수 (static 변수, 공유 변수) // 메서드 영영 void method() { i..

(Java/자바) System.arraycopy()를 이용해 배열 복사 [내부링크]

System 클래스의 arraycopy()를 사용해 빠르게 배열을 복사 할 수 있습니다. 아래의 여러 예시를 통해 알아 볼 것이지만 System.arraycopy(num, 0, newNum, 0, num.length); 쉽게 이해하자면 newNum 배열의 0번째 부터 데이터를 넣을 건데, 그 데이터는 num 배열의 0번째 부터 num.length개의 데이터를 넣을 것이다. 쉬운 이해를 위해 예제 코드를 통해 알아봅시다. public class ArrayEx4 { public static void main(String[] args) { char[] abc = {'A', 'B', 'C', 'D', 'E'}; char[] num = {'0', '1', '2', '3', '4', '5', '6', '7', '8..

[Java/자바] 연산자의 모든 것 [내부링크]

연산자는 '연산을 수행하는 기호'를 말하며 +, -, * 등이 연산자에 해당됩니다. 연산자가 연산을 수행하려면 연산자의 대상이 있어야하는데, 이 대상을 '피연산자'라고 합니다. 피연산자로 상수, 변수, 식을 사용할 수 도 있습니다. 연산자(operator) = 연산을 수행하는 기호 ( +, -, * 등 ) 피연산자(operand) = 연산자의 작업 대상(변수, 상수, 리터럴, 수식) 연산자의 종류 연산자의 종류는 다음과 같으며 하나씩 알아보도록 하겠습니다. 종류 연산자 설명 산술 연산자 + - * / % 사칙 연산( +, -, *, / )과 나머지 연산 ( % ) 비교 연산자 > = , = 두 피연산자의 값의 크기를 비교합니다. 참이면 true를, 거짓이면 false를 반홚바니다. 기본형 중에서는 boo..

ASCII(아스키 코드)와 Unicode(유니코드)란 ? [내부링크]

개발을 하다 보면 아스키 코드, 유니코드란 말 참 많이들어 보셨을겁니다. 많이는 들어봤지만 자바스크립트를 공부할때는 실제로 크게 쓰이지않아 나중에 알아봐야지 했지만, 자바를 공부하고 나서 아스키코드와 유니코드를 이해하는게 필요하다고 느끼게 되어 ASCII(아스키 코드)와 Unicode(유니코드)가 무엇인지에 대해 포스팅해보려 합니다. 설명하기 앞서 인코딩(encoding)과 디코딩(decoding)에 대해 알아보겠습니다. 위 그림을 보면 문자 'A'의 유니코드가 65인 것을 알 수 있습니다. 그래서 문자 'A'를 인코딩하면 65가 되고, 반대로 65 유니코드를 디코딩하면 문자 'A'가 됩니다. 여기서 인코딩이란 ? 문자를 코드로 변환하는 것을 말합니다. 즉, 컴퓨터는 0과 1밖에 모르기 때문에 'A'라는..

[Java/자바] StringBuilder 클래스란 ? [내부링크]

String은 변경 불가능한 문자열을 생성하지만 StringBuilder는 변경 가능한 문자열을 만들어 주기 때문에, String을 합치는 작업이 필요할 시 사용할 수 있습니다. 객체 선언 StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder("ABC"); 문자열을 바로 넣을 수도 있다. StringBuilder 메서드 public class sb { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); // 문자열 추가 System.out.println(sb.append("bbb")); // bbb System.out.printl..

(Java/자바) 프로그래머스 Lv1 - 정수 내림차순으로 배치하기 [내부링크]

문제 설명 함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다. 제한 조건 n은 1이상 8000000000 이하인 자연수입니다. 입출력 예 n return 118372 873211 Solution.java import java.util.*; class Solution { public long solution(long n) { String[] arr = String.valueOf(n).split(""); Arrays.sort(arr); // 오름차순 정렬 StringBuilder sb = new StringBuilder(); for (int i = 0; i < arr..

(Java/자바) 숫자를 문자열로 변환 - toString(), valueOf() [내부링크]

이번 포스팅에서는 숫자를 문자열로 변환하는 방법에 대해 알아보려합니다. 문자열을 숫자로 변환하는 방법은 아래 포스팅을 참고하시면 됩니다. (Java/자바) 문자열을 정수로 변환 - parseInt(), valueOf() 문자열(String)을 정수로 변환하는 작업은 자주 있는 일입니다. 반대로 정수를 문자열로 변환하는 것도 마찬가지겠죠 이번 포스팅에선 문자열을 정수로 변환해주는 메서드 parseInt() 와 valueOf() 에 hstory0208.tistory.com 숫자를 String으로 변환하는 방법은 총 3가지가 있습니다. toString(), valueOf() 그리고 간단하게 빈 문자열과 int를 '+' 연산자로 연결하여 문자열로 변환하는 방법. 하나씩 알아보겠습니다. Integer.toStri..

(Java/자바) 문자열을 정수로 변환 - parseInt(), valueOf() [내부링크]

문자열(String)을 정수로 변환하는 작업은 자주 있는 일입니다. 반대로 정수를 문자열로 변환하는 것도 마찬가지겠죠 이번 포스팅에선 문자열을 정수로 변환해주는 메서드 parseInt() 와 valueOf() 에 대해 알아보고 이 둘의 차이점에 대해 설명해보고자합니다. Integer.parseInt() parseInt() 메서드는 파라미터로 숫자로 변환할 문자열을 입력받고, 기본형인 int(정수)로 변환합니다. 두번째 매개변수가 생략된 경우 10진수로 변환된 값을 반환하고, 10진수가 아닌 다른 진수로 변환하고 싶으면 두 번째 매개변수에 변환하고자 하는 진수를 입력합니다. public class ParseInt { public static void main(String[] args) { String st..

(Java/자바) 프로그래머스 Lv1 - 문자열 내 p와 y의 개수 [내부링크]

문제설명 대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다. 예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다. 제한사항 문자열 s의 길이 : 50 이하의 자연수 문자열 s는 알파벳으로만 이루어져 있습니다. 입출력 예 s answer "pPoooyY" true "Pyy" false 입출력 예 #1 'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다. 입출력 예 ..

(Java/자바) 프로그래머스 Lv1 - 하샤드 수 [내부링크]

문제 설명 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요. 제한 조건 x는 1 이상, 10000 이하인 정수입니다. 입출력 예 arr return 10 true 12 true 11 false 13 false 입출력 예 #1 10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다. 입출력 예 #2 12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다. 입출력 예 #3 11의 모든 자릿수의 합은 2입니다. 1..

Java - 특수 문자 다루기 [내부링크]

\ " 역슬래쉬 " 를 이용해 아래 옵션으로 다양한 방식으로 문자를 표현할 수 있습니다. 특수문자 문자 리터럴 tab ( 들여쓰기 ) \t backspace ( 한 글자 지우기 ) \b form feed ( 프린터에 보내면 연속용지가 다음 페이지의 시작 부분으로 넘겨진다. ) \f new line ( 줄 바꿈 ) \n carriage return ( 현재 줄에서 젤 앞으로 보낸다 ) \r 역슬래쉬 나타내기 \\ 작은따옴표 나타내기 \' 큰따옴표 나타내기 \" 공백 나타내기 \0 유니코드(16진수)문자 \u 예제 코드 public class SpecialCharEx { public static void main(String[] args) { // TODO Auto-generated method stub S..

(Java/자바) 프로그래머스 Lv1 - 정수 제곱근 판별 [내부링크]

문제 설명 임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요. 제한 사항 n은 1이상, 50000000000000 이하인 양의 정수입니다. 입출력 예 n return 121 144 3 -1 입출력 예#1 121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다. 입출력 예#2 3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다. Solution.java 나의 풀이 class Solution { public long solution(long n) { long sqrt = (long) Math.sqrt(n); if..

(Java/자바) 프로그래머스 Lv1 - 자릿수 더하기 [내부링크]

문제설명 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다. 제한사항 N의 범위 : 100,000,000 이하의 자연수 입출력 예 N answer 123 6 987 24 입출력 예 #1 문제의 예시와 같습니다. 입출력 예 #2 9 + 8 + 7 = 24이므로 24를 return 하면 됩니다. Solution.java 내가 푼 풀이 자바스크립트로 푼 방식대로 풀어 for문을 이용해서 풀었습니다. 자바스크립트와 좀 다른점이 많아 문자를 정수로 변환한다던가 answer += Integer.parseInt(str[i]) 로 answer에 str의 i번째 값을 추가하는 방식을..

Java - print, println, printf 출력문의 모든 것 [내부링크]

자바스크립트에서는 console.log() 로 출력결과를 보고 Java에서는 System.out.print() 를 통해 출력 결과를 볼 수 있습니다. 우선, print와 println은 간단합니다. 다음 코드를 통해 쉽게 이해할 수 있습니다. print print는 한줄로 결과를 출력합니다. System.out.print("자바의"); System.out.print(" 정석"); System.out.print(" 정독하기"); println println은 각 결과를 줄 바꿈을 통해 출력합니다. System.out.println("자바의"); System.out.println(" 정석"); System.out.println(" 정독하기"); printf - 형식화된 출력 보통 출력의 결과를 보고 싶을 때..

Java - 상수와 리터럴 ( constant 와 literal ) 이란? [내부링크]

상수 ( constant ) 상수란 변수와 마찬가지로 "값을 저장할 수 있는 공간"이지만, 변수와 달리 한번 값을 저장하면 달느 값으로 변경할 수 없습니다. 즉, 한 번 선언하면 값은 고정됩니다. java에서 상수를 선언하는 방법은 변수와 동일하며 변수의 타입 앞에 "final"을 붙여주면됩니다. 그리고 상수의 이름은 모두 대문자로 한다는 규칙에 따라 모두 대문자로 작성합니다. final int MAX_SPEED = 100; // 상수 MAX_SPEED를 선언하고 초기화 final int MAX_SPEED; // Error : 상수는 선언과 동시에 초기화 해야한다. final int MIN_SPEED = 10; // MIN_SPEED를 선언과 동시에 초기화했음 MIN_SPEED = 200; // Erro..

Java - 변수의 타입 (기본형과 참조형) [내부링크]

data의 type 우리가 주로 사용하는 값 ( data ) 의 종류 ( type )은 크게 "문자와 숫자"로 나눌 수 있으며, 숫자는 다시 "정수와 실수"로 나눌 수 있습니다. 이런 값( data )의 종류 ( type )에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것을 자료형 ( data type ) 이라고 합니다. 자바 프로그래머 권장 규칙 1. 클래스 이름의 첫 글자는 항상 대문자로 한다. => 변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다. 2. 여러 단어로 이루어진 일므은 단어의 첫 글자를 대문자로 한다. => lastlndexOf, StringBuffer 3. 상수의 이름은 모두 대문자로 하고, 여러 단어로 이뤄진 경우 "_"로 구분한다. ( 상수란 고정된 값, 변하지 않는 ..

TDD ( 테스트 주도 개발 ) 란 ? [내부링크]

TDD ( Test Driven Development ) TDD란 "Test Driven Development"의 약자로 "테스트 주도 개발"이라고 합니다. 제품이 오류 없이 정상 작동하는지 확인하기 위해 모든 코드는 프로그래머가 작성하고 나서 테스트를 거치게 되는데, TDD에서는 제품의 기능 구현을 위한 코드와 별개로, 해당 기능이 정상적으로 움직이는지 검증하기 위한 테스트 코드를 작성합니다. 이를 통해 테스트가 실패할 경우, 테스트를 통과하기 위한 최소한으로 코드를 개선하고, 최종적으로 테스트에 성공한 코드를 리팩토링 하는 과정을 거칩니다. TDD 개발 절차 테스트 주도 개발은 다음과 같은 개발 절차를 가집니다. RED ( Write a failing test ) : 실패하는 테스트 코드를 먼저 작성..

멀티 프로세스와 멀티 스레드란 ? [내부링크]

이전 포스팅에선 프로세스와 스레드에 대해 알아보았습니다. 이번 포스팅에선 멀티 프로세스와 멀티 스레드에 대해 알아볼건데요. 프로세스와 스레드가 무엇인지에 대해 이해가 안가신다면 아래 포스팅을 참고하시면 됩니다. 프로세스와 스레드(process, thread)에 대해 알아보자. Process ( 프로세스 ) “프로그램 ( 어떤 작업을 위해 실행할 수 있는 파일 .exe )이 메모리에 올라와 운영체제로 부터 CPU를 할당받고 프로그램이 연속적으로 실행되고있는 상태.” ( 일을 처리하는 hstory0208.tistory.com 멀티 프로세스 ( Multi Process ) 하나의 프로세스는 하나의 작업만 처리할 수 있기 때문에 여러 작업을 동시에 처리할 수 없습니다. 그렇기 때문에 부모 프로세스를 fork 해..

프로세스와 스레드(process, thread)에 대해 알아보자. [내부링크]

2022.10.04 - [CS 기초 지식/[운영체제]] - 멀티 프로세스와 멀티 스레드란 ? Process ( 프로세스 ) “프로그램 ( 어떤 작업을 위해 실행할 수 있는 파일 .exe )이 메모리에 올라와 운영체제로 부터 CPU를 할당받고 프로그램이 연속적으로 실행되고있는 상태.” ( 일을 처리하는 일련의 과정 ) 음식을 예로 우리가 치킨을 먹기 위해 BBQ 치킨에 갔다고 가정해봅시다. BBQ에가서 치킨을 주문시키면 BBQ의 레시피를 주는 것이아니라 BBQ만의 특별한 레시피를 가지고 치킨을 만들어 주겠죠 ? 여기서 레시피가 코드 파일 ( 프로그램 )이고, 치킨은 프로그램이 실행 되어 우리가 사용할 수 있는 프로세스 입니다. 레시피를 통해 치킨을 만드는 것처럼, 코드 파일( 프로그램 )을 실행 시켜 "프..

(javascript) - Lv1 : 문자열 내 맘대로 정렬하기 [내부링크]

문제 설명 문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다. 제한 조건 strings는 길이 1 이상, 50이하인 배열입니다. strings의 원소는 소문자 알파벳으로 이루어져 있습니다. strings의 원소는 길이 1 이상, 100이하인 문자열입니다. 모든 strings의 원소의 길이는 n보다 큽니다. 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다. 입출력 예 입출력 예 1 "sun", "bed", "car"..

[Linux] kernel(커널) 이란 ? 쉽게 알아보자 [내부링크]

컴퓨터는 크게 2가지로 구분할 수 있습니다. 물리적으로 만질 수 있는 하드웨어(키보드, 모니터, 컴퓨터 본체와 본체 안에 있는 CPU, 메모리 등) 물리적으로 존재하지 않는 소프트웨어 그리고, 소프트웨어는 운영체제(Linux, MacOS, Windows 등)와 그 위에 설치되는 프로그램인 응용 프로그램 (Exel, Chrome 등)으로 다시 나눌 수 있습니다. 그리고 운영체제는 커널(Kernel)과 시스템 프로그램으로 구분됩니다. 커널(Kernel)과 시스템 프로그램 커널은 운영체제의 핵심부분으로써 주로 디바이스 관리, 프로세스 관리, 메모리 관리, 시스템 콜 제공 같은 기능을 관리하는 등, 컴퓨터 자원을 관리합니다. 하지만 커널은 항상 컴퓨터 자원들만 바라보고 있어 사용자와 직접적인 상호작용은 하지 않..

[Linux] Shell 이란 ? 쉽게 알아보자. [내부링크]

Shell이란, 사용자의 명령어를 운영체제가 알아들을 수 있도록 해석하고 커널에게 전달합니다. 그리고 커널은 해석된 명령어를 받아 하드웨어에 직접적으로 명령을 내립니다. shell의 예시로 우리가 cmd에서 명령어를 칠 때를 봅시다. shj@DESKTOP-DS69STB:~$ ls -l 저는 이와 같은 ls -l 이라는 명령어를 쳤습니다. 하지만 해석하지못하면, 하드웨어는 "이게 뭔 말이야"라고 하며 이해하기 힘듭니다. 그래서 Shell이 필요하고 Shell이 "ls -l" 은 "현재 디렉토리에 있는 내용들을 -l 옵션으로 긴 목록 형식으로 출력해주세요"라고 해석해줍니다. 그러면 해석된 명령을 커널에게 전달하고 커널은 하드웨어에게 해석된 명령을 실행하라합니다. Shell의 주요 기능들 사용자와 커널 사이에..

Linux (리눅스) 란 ? [내부링크]

개발을 하다보면 Linux 라는 단어에 대해 수도 없이 들어봤을겁니다. Linux가 운영체제인것 까진 그래도 알겠지만 정확히 뭐고 왜 사용하는지에 대해선 알지 못하기 때문에 이번 포스팅을 통해 Linux가 무엇인지, 왜 사용하는지?에 대해 간단히 알아보고자 합니다. UNIX 리눅스를 알기 전 먼저 리눅스의 조상인 유닉스에 대해 알아야 합니다. 유닉스에 대해 간단하게 알아보자면, 1965년 MIT, AT&T 벨 연구소, General Electric 소속 개발자들이 모여 멀티태스킹(다중작업)을 지원하는 멀틱스(Multics)라는 운영체제를 개발하기 시작했습니다. 하지만 이 당시 멀티태스킹 작업은 너무나도 어려운 작업이였기 때문에 실패했었습니다. 그 이후 프로젝트를 만들던 직원들이 따로 나와 멀틱스 프로젝트..

Git(깃)과 Github(깃허브)의 차이점에 대해 알아보자. [내부링크]

개발을 하다보면 자연스럽게 사용하게 되는 git과 Github 사실 저는 이 두 개가 같은 건줄알고 Github 줄인 말이 git인줄 알았습니다 ㅋㅋ; 하지만 CS 면접 나오는 대표적인 질문들 중 하나이기에 이번 포스팅으로 차이점을 알아보고자 합니다. Git ( 깃 ) 이란 ? 로컬 파일의 변경사항을 기록하고 해당 파일에 대한 여러 사용자 간의 작업을 조율하기 위한 분산형 버전 관리 시스템(VCS : Version Control System) 입니다. Git 이 왜 필요한지에 대해 살펴보자면, 우리가 과제를 제출할 때를 봅시다. 처음에 과제를 완성했다하고 이름을 저장했을 때는 "김김씨 과제.pdf"라고 저장할 것입니다. 근데, 다시 확인을 해보니 수정이 필요해 이전 파일이 필요할지도 모르니 복사하여 ..

프록시 ( Proxy ) 란 ? 어떤 역할을 하는가? [내부링크]

proxy의 사전적의미를 보면 "대리" 라는 뜻을 가집니다. Client와 Server가 직접 통신할 때, 보안상의 문제를 방지하기 위해서 직접 통신하지 않고 중계자를 거쳐 통신합니다. 이때 중계자는 바로 프록시 ( proxy ) 입니다. Client와 Server 사이에 프록시 서버가 중계를 할 떄, Client는 프록시 서버를 "Server"라고 인식하고, Server는 프록시 서버를 "Client"라고 인식합니다. 프록시 서버는 서버의 위치에 따라 "Forward 프록시"와 "Reverse 프록시" 2가지로 나뉩니다. Forward 프록시 클라이언트 편 ( 사용자들을 대신해 인터넷 연결 ) 클라이언트 대신 프록시 서버가 목적 서버에 통신해주는 구성을 "포워드 프록시"라고 합니다. Forward 프록..

동기와 비동기의 개념 및 차이에 대해 쉽게 알아보자. [내부링크]

동기(Synchronous) 방식 동기란, 말 그대로 동시에 일어난다는 뜻입니다. 요청을 하면 동시에 응답을 한다는 약속으로, 바로 요청을 하면 시간이 얼마가 걸리던지 요청한 자리에서 응답(결과)가 주어져야 합니다. 동기의 예 중에는 여러가지가 있지만, 콜센터의 직원을 예로 설명해 보겠습니다. 콜센터 직원 한명에게 3명의 고객이 전화를 건다고 생각해봅시다. 한명의 직원은 각기 다른 3명의 고객들의 이야기를 듣고 대답해줄 순 없을 겁니다. 그렇기 때문에 전화가 온 순서대로 고객의 전화를 받고 그 뒤 고객들은 "상담원이 통화중이니 잠시만 기다려주세요"라는 안내 음성을 들은적이 있을겁니다. 콜센터 직원은 제일 먼저 통화를 건 고객 1과의 전화를 먼저 한 후 끝나면 대기가 걸려있던 고객 2의 대기를 풀고 전화를..

SSH (Secure SHell) 란? 쉽게 이해해보자. [내부링크]

"Secure Shell Protocol" 즉 네트워크 프로토콜 중 하나로 컴퓨터와 컴퓨터가 인터넷과 같은 Public Network를 통해 서로 통신을 할 때 보안적으로 안전하게 통신을 하기 위해 사용하는 프로토콜입니다. SSH는 개발을 하다보면 한번씩은 꼭 접해봤을 겁니다. 대표적인 예로는 Github을 사용할 때로, Github에 코드를 푸쉬하거나 Github 레포지토리를 clone할 때 사용하기도 합니다. SSH를 사용하면 네트워크 상의 다른 컴퓨터에 원격 로그인하여 ( 예를 들어, AWS EC2 원격접속 ), 원격 시스템에서 명령을 실행하고, 다른 시스템으로 파일을 복사 ( SCP 명령어 ) 할 수 있습니다. 데이터 전송 원격 접속 원격 제어 SSH를 사용하는 이유는, FTP나 Telnet과 같..

NAT (Network Address Translation) 란 ? [내부링크]

NAT란 네트워크 주소 변환 (Network Address Translation) 줄여서 NAT 라고 합니다. 우리가 인터넷을 사용할 때 공인 IP 와 사설 IP를 나누어서 사용하게 되는데, 이 공인 IP와 사설 IP의 경계에서 인터넷 주소를 주고 받으며 네트워크 트래픽을 주고 받게 해주는 역할을 합니다. 아마 공유기를 설치한 경험 다들 있으실 겁니다. 공유기를 설치할 때 랜선을 공유기 뒤 쪽 포트에 꽂게 됩니다. 그 랜선엔 우리 집에 부여된 공인 IP가 있습니다. 외부의 네트워크에서 우리 집에 랜선을 끌어 오면서 우리 집의 공간이 공유기를 통해 사설네트워크(사설망)가 된 것입니다. IP는 각 기기당 1나 씩만 할당되는데, 공유기에는 한개의 랜선만 꽂혀서 1개의 IP만 부여 받았는데 어떻게 집에 있는 여..

공인(public) IP, 사설(private) IP란 ? ( 고정 IP, 유동 IP ) [내부링크]

IPv4와 IPv6 란? IPv4와 IPv6의 차이점에 대해 알아보자. IP 주소 ( Internet Protocol Address ) 란 ? 인터넷에 연결되어 있는 모든 장치들(컴퓨터, 서버 장비, 스마트폰 등)을 식별할 수 있도록 각각의 장비에게 부여되는 고유 주소 네트워크 상에서 다른 PC에 접 hstory0208.tistory.com 위 포스팅에서 알 수 있듯이 우리가 사용하는 IPv4는 사용가능한 IP 갯수가 43억개이지만, 전세계가 발전하면서 전자기기가 점점 많아지고, 인터넷 수요가 늘어나면서 IPv4 주소가 부족한 문제를 겪고있습니다. IPv4의 문제점을 보완한 IPv6가 나오긴 했지만 기존의 주소체계에서 IPv6로 변경하기엔 천문학적인 비용이 들기 때문에 아직 IPv4를 사용하는 실정입니다..

Lotto 6/45 자동번호추첨기 제작 [내부링크]

Lotto 6/45 브라우저 https://hevlotto.netlify.app/ 로또 추첨기 발 행 일: 2020/02/01(수) 14:32:12 추 첨 일: 2020/02/01(토) 지급기한: 2020/02/01 hevlotto.netlify.app 모바일 https://mhevlotto.netlify.app/ 로또 추첨기 발 행 일: 2020/02/01(수) 14:32:12 추 첨 일: 2020/02/01(토) 지급기한: 2020/02/01 mhevlotto.netlify.app 설명 QR 코드는 구현을 아직 못해 작동하지 않습니다. ( 추후 업데이트 예정 ) 발행일은 현재 날짜 기준 + 현재 요일 + 현재 시간 ( 시 : 분 : 초 ) 로 구현하였습니다. 추첨일은 실제 추첨일인 ( 현재 날짜 기준..

[JS/Method] slice(), splice(), split() 에 대해 알아보자. [내부링크]

코딩 테스트 문제들을 풀면서 slice(), splice(), split() 메서드를 자주 접했을 겁니다. 근데 저는 이 메서드들이 다 비슷비슷해서 자세히 보지 않는 한 큰 차이가 없어보이더라구요. 그래서 이 번 포스팅에서 확실히 다뤄 보려합니다. slice(), splice() 메서드는 배열을 다룰 때 자주 사용하는 함수 slice() splice() 원본 배열은 수정되지 않는다 원본 배열 자체를 수정한다. split()는 문자열을 특정 문자를 기준으로 나눠, 배열로 바꿀 때 사용하는 함수 Array.prototype.slice() slice()는 begin부터 end 전까지의 복사본을 새로운 배열 객체로 반환한다. 즉, 원본 배열은 수정되지 않는다. arr.slice([begin[, end]]) ..

도메인과 DNS 란 ? [내부링크]

도메인 ip는 사람이 이해하고 기억하기 어렵기 때문에 이를 위해서 각 ip에 이름을 부여할 수 있게 했는데, 이것을 도메인이라고 합니다. 우리는 도메인을 통해 한눈에 파악하기 힘든 IP 주소를 분명하게 나타낼 수 있습니다. 도메인이란 ? 도메인의 구조 도메인은 Root(루트) 라 불리는 도메인 이하에 역트리 구조로 구성되어 있습니다. 루트 다음으로 다음과 같이 2가지 도메인으로 나뉩니다. 1. 국가 최상위 도메인(ccTLD) - 2단계 도메인 SLD(Second Level Domain) ccTLD 다음단계 2. 일반 최상위 도메인(gTLD) 국가 최상위 도메인(ccTLD) 인터넷 상으로 국가를 나타내는 도메인으로 'kr(대한민국)', jp(일본), cn(중국), us(미국) 등 영문으로 구성된 영문 국가..

Gateway(게이트웨이)란 ? Router(라우터)란? 각 개념과 차이점에 대해 알아보자. [내부링크]

Gateway ( 게이트웨이 ) 란 ? “한 네트워크(segment)에서 다른 네트워크로 이동하기 위하여 거쳐야 하는 지점” 으로 서로 다른 네트워크의 프로토콜이 다를 경우에 중재 역할을 해줍니다. 서로 다른 네트워크란 아래 포스팅으로 클래스별 IP 대역을 참고하시면 이해 되실겁니다. [네트워크] Class란 ? CIDR 란 ? 차이점 및 개념을 쉽게 이해해보자 (feat.서브넷팅, 슈퍼넷팅) IP 란 ? IP는 8비트 씩 4자리로 이루어진 32 자리 이진수로 구성되어 있습니다. 아래 포스팅에 IPv4 와 IPv6에 대해서도 한번 읽어보시는 것을 추천 드립니다. IPv4와 IPv6 란? IPv4와 IPv6의 차이점에 대해 hstory0208.tistory.com 만약 내 네트워크 (192.168.0.1)..

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

저번 포스팅에서 "암호화"에 대해 알아보았습니다. 암호화에는 단방향 암호화, 양방향 암호화 두 종류가 있었는데요. 이번 포스팅에선 양방향 암호화인 대칭키(비공개키)와 비대칭키(공개키)에 대해 설명해 보도록하겠습니다. 암호화, 복호화란 무엇인지에 대해 궁금하신 분들은 아래 포스팅을 참고하시면 됩니다. 암호화, 복호화란 ? 쉽게 알아보자. 암호란 ? 평문을 암호문으로 변환하거나 암호문을 평문으로 변환하는 기술을 의미합니다. 평문 해독 가능한 형태의 텍스트 ( 보고 알아볼 수 있다. ) "12345" , "안녕하세요", "반갑습니다" 암호문 hstory0208.tistory.com 대칭키(비공개키) 암복호화에 사용하는 키가 동일한 암호화 방식으로 공통키라고도 합니다. 송수신자는 서로 공유된 대칭키를 가지고 통..

암호화, 복호화란 ? 쉽게 알아보자. [내부링크]

암호란 ? 평문을 암호문으로 변환하거나 암호문을 평문으로 변환하는 기술을 의미합니다. 평문 해독 가능한 형태의 텍스트 ( 보고 알아볼 수 있다. ) "12345" , "안녕하세요", "반갑습니다" 암호문 해독 불가능한 형태의 텍스트 ( 보고 알아 볼 수가 없다. ) "A@3EC!BR_1T", "E)$A!EM|+A11", "꿜꽐뚫뽈쎵썀$!떙" 만약 암호가 적용되지 않는 다면 어떨까요 ? 이처럼 중간에 악의적인 의도를 가진 해커가 중간에 패킷을 탈취해 데이터를 확인할 수 있어 해킹에 위험이 있습니다. 하지만 암호가 적용된다면 ? 암호화를 통해 중간의 데이터가 암호문으로 변경되어 해커가 이를 탈취한다해도 읽을 수 없어 해킹에 안전합니다. 암호화와 복호화란 ? 암호화 평문을 암호문으로 변환하는 과정. 평문 ("..

Port ( 포트 ) 란 무엇인가 ? 포트에 대해 알아보자. [내부링크]

Port 란 ? 데이터를 받을 프로세스(process)가 어떤 것인지를 알아야 데이터가 제대로 전송이 되는데, 이때 사용하는 식별자를Port Number(포트 번호)라 합니다. 포트 번호는 IP 주소 뒤 : 다음에 표시하며 예를 들자면 다음과 같습니다. http://127.0.0.1:3000 포트번호를 왜 사용해야하는지에 대해 쉽게 예를 들어보자면 택배기사 최배달이 물건(데이터)를 구매자에게 전달해줘야하는데 구매자의 아파트주소(MAC address)와 이름(IP address)은 알지만 고객이 그 아파트의 몇 호에 있는지 모른다면 배달을 할 수없는 곤란한 상황에 처할 것입니다. 이때, 103호 인지 1204호인지 알려주는것을 Port Number 라고 할 수 있습니다. MAC 주소 = 하드웨어 주소 IP..

SSL 이란 ? TLS 이란 ? [내부링크]

SSL (Secure Sockey Layer) 이란 ? HTTPS에 사용되는 “클라이언트와 웹 서버버간의 통신 암호화 프로토콜.”입니다. SSL은 HTTPS와 같이 443 포트를 사용하며 통신 데이터가 암호화되어, 중간에 정보를 가르채려는 3자가 나타나도 데이터를 지킬 수 있습니다. 하지만 데이터 송/수신 과정에서 암호화, 복호화가 발생하므로 속도가 느리다는 단점이 있습니다. SSL이 적용되지 않은 경우 아래 그림과 같이 "High Value Information" 이라는 평문 (Plain Text)가 그대로 전송됩니다. 이렇게 되면 제 3자가 통신 패킷을 탈취할 경우, 그 내용을 쉽게 확인할 수 있는 문제점이 있습니다. SSL이 적용된 경우 요청을 암호화해서 보내므로 통신 패킷이 탈취되어도 복호화 키가..

HTTP와 HTTPS의 개념 및 차이점에 대해 알아보자. [내부링크]

HTTP ( Hyper Text Transfer Protocol ) 란 ? “하이퍼텍스트(HyperText)를 전송(Transfer)하기 위해 사용되는 통신 규약(Protocol)”. HTTP는 80번 포트를 사용하고 있으며 HTTP는 80번 포트에서 요청을 기다리고 클라이언트는 80번 포트로 요청을 보냅니다. HTTP의 특징 Stateless ( 무상태성 ) 을 가져, 클라이언트의 상태 정보를 가지지 않는 서버 처리 방식입니다. 클라이언트와 첫번째 통신에서 데이터를 주고 받았다 해도, 두번째 통신에서 이전 데이터를 유지하지 않는다는 특징을 가지고 있습니다. 정보를 일반 텍스트로 보내기 때문에 "안전하지 않은" 것으로 간주되기 때문에 사이버 공간을 통해 이동하는 데이터를 누구나 가로챌 수 있습니다. 그렇..

쿠키, 캐시, 세션 이란 ? 각 개념들과 차이점에 대해 쉽게 알아보자. [내부링크]

쿠키, 캐시, 세션에 대해 설명하기 전에 먼저 HTTP의 특징에 대해 짚고 넘어가야합니다. HTTP에 대한 설명은 아래 포스팅 참고하시면 좋습니다. HTTP와 HTTPS의 개념 및 차이점에 대해 알아보자. HTTP ( Hyper Text Transfer Protocol ) 란 ? “하이퍼텍스트(HyperText)를 전송(Transfer)하기 위해 사용되는 통신 규약(Protocol)”. HTTP는 80번 포트를 사용하고 있으며 HTTP는 80번 포트에서 요청을 기다리.. hstory0208.tistory.com HTTP에 대한 특징을 간단하게 설명하자면.. HTTP는 Stateless ( 무상태성 ) 프로토콜로 데이터를 주고 받아도 데이터를 유지하지 않습니다. HTTP는 통신 후, 통신이 끝나면 클라이언..

IaaS, PaaS, SaaS 란 무엇인가? 각 개념을 알아보고 비교해보자. [내부링크]

위 그림에서 볼 수 있는 하얀색 박스는 모두 사용자가 직접 관리하는 부분이고 파란색 박스 부분은 공급체로 부터 제공 받는 부분입니다. 전통적인 IT는 사용자가 직접 하나 부터 열 까지 다 관리 해야했다면 클라우드 서비스를 통해 클라우드 서비스 종류 별로 제공되는 부분을 관리 받을 수 있어 사용자는 모든것을 다 관리 할 필요 없습니다. IaaS (Infrastructrue as a Service) - 서버를 운영하기 위한 IT 인프라 서비스를 제공 IaaS를 사용함으로써 기존 On-premise 방식보다 확장성이 좋으며 가상화 기술을 사용하여 탄력적으로 리소스를 관리함으로써 리소스 낭비를 줄여 비용적인 측면에서 효율성을 만들어 낼 수 있다. 장점 고객은 가상 서버 하위의 레벨에 대해서는 고려할 필요가 없다..

URI와 URL 비슷해보이는데 차이점이 뭘까? ( 완벽 정리 ) [내부링크]

우리가 인터넷을 할때 URI와 URL이란 걸 아주 자주 접할겁니다. 하지만 URI URL 두 가지가 있는지 모르고 이 두가지를 하나로 혼용해 "인터넷 주소잖아" 라고 생각하는게 일반적입니다. 크게 문제는 없지만 이 둘의 차이점이 존재합니다. 사진을 통해 간단히 보자면 URI가 가장 큰 개념으로 URI의 하위 개념으로 URL과 URN을 포함하고있습니다. 이번 포스팅에선 URI와 URL,URN 각 개념과 차이점에 대해 알아보려합니다. 먼저 URL의 구조 부터 알아야 하기 때문에 URL 부터 설명해보겠습니다. URL URN URI URL ( Uniform Resource Locator ) - 통합 자원 지시자 URL은 우리가 가장 흔히 보는 것으로 URL은 Resource의 정확한 위치 정보(파일의 위치)를 ..

(javascript) 알고리즘 - Lv4 단어 퍼즐 (코드별 설명,해석) [내부링크]

문제 설명 단어 퍼즐은 주어진 단어 조각들을 이용해서 주어진 문장을 완성하는 퍼즐입니다. 이때, 주어진 각 단어 조각들은 각각 무한개씩 있다고 가정합니다. 예를 들어 주어진 단어 조각이 [“ba”, “na”, “n”, “a”]인 경우 "ba", "na", "n", "a" 단어 조각이 각각 무한개씩 있습니다. 이때, 만들어야 하는 문장이 “banana”라면 “ba”, “na”, “n”, “a”의 4개를 사용하여 문장을 완성할 수 있지만, “ba”, “na”, “na”의 3개만을 사용해도 “banana”를 완성할 수 있습니다. 사용 가능한 단어 조각들을 담고 있는 배열 strs와 완성해야 하는 문자열 t가 매개변수로 주어질 때, 주어진 문장을 완성하기 위해 사용해야 하는 단어조각 개수의 최솟값을 return..

TCP와 UDP란? 왜 사용하는지 알아보자 [내부링크]

IP(Internet Protocol)의 한계 복잡한 인터넷 망에서 클라이언트와 서버가 서로 통신하기 위해서 일종의 규칙이 있어야하는데, 이때 IP 주소를 통해 통신할 수 있게 됩니다. 클라이언트가 서버에 데이터를 보낼 때 그냥 보내는 것이 아니라 Packet(패킷)으로 포장해 데이터를 보내게 됩니다. ( Packet : 통신망을 통해 전송하기 쉽게 자른 데이터 전송 단위. 쉽게 말해 택배 포장 박스라고 생각할 수 있습니다. ) 하지만 이 과정에서 IP는 다음과 같은 한계가 있습니다. 1. 비연결성 - 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷이 전송된다. 2. 비신뢰성 - 중간에 패킷이 사라지거나 패킷이 보낸 순서와 다르게 전송할 수 있다. 3. 같은 IP를 사용하는 서버에서 통신하는 애플리..

DevOps 데브옵스란 무엇이고 어떤일을 할까 ? (CI/CD 파이프라인) [내부링크]

개발을하거나 개발공부를 하면서 한번쯤은 들어보거나 처음들어보는 사람도 있을겁니다. 저는 비전공자로 부트캠프로 개발공부를 시작하게 되었는데 그 부트캠프가 바로 DevOps 부트캠프였었습니다. 이 당시 개발 분야에 대한 지식도 전무했고, 단순히 요즘 뜨는 직군이고 클라우드의 중요성이 점점 확대 됨에따라, DevOps 직군의 중요도는 점점 더 커질 것이라는 것에 지원하여 4개월동안 공부를 하였습니다. 비록 짧지만 4개월 동안 DevOps에 대해 많은 것을 배울 수 있었고 DevOps가 무엇인지 어떤일을 하는지 알리고자 이 글을 작성하게 되었습니다. DevOps란 ? DevOps는 개발(Development) 와 운영(Operation)이 합쳐져 탄생한 개발 방법론입니다. 이렇게 보면 개발과 운영을 다하는게 D..

(데이터베이스 기초) DBMS, SQL 쉽고 간단하게 이해해보자. [내부링크]

데이터베이스 ( Database ) 여러 사람들이 공유하고 사용할 목적으로 통합 관리되는 데이터들의 모임이라고 할 수 있습니다. 데이터베이스가 등장하기 이전에는 파일 시스템을 사용해서 데이터를 관리했다고 합니다. 파일 시스템을 이용하면 파일 단위로 저장할때, 데이터 종속성 문제와 중복성, 데이터 무결성 문제가 존재하기 때문에 이런 문제점을 해결 해주는 데이터베이스가 등장하고 데이터베이스를 사용하기 시작했다고합니다. 데이터베이스는 데이터를 효율적으로 처리하기 위하여 개발된 것으로, 여러 사람에 의해 공유되어 사용될 목적으로 통합하여 관리되는 데이터의 집합 자료항목의 중복을 없애고 자료를 구조화하여 저장함으로써 자료 검색과 갱신의 효율을 높일 수 있습니다. 또한 업무가 확대되어도 새로 파일을 준비할 필요가 ..

RDBMS와 NoSQL의 차이점 및 개념 완벽 정리 [내부링크]

RDBMS와 NoSQL의 차이점 CS 면접 단골 질문이라고 하더라구요 ? 간단한 차이점에 대해 아는 사람은 많겠지만 깊이 있게 아는 사람은 그렇게 많지 않다고 생각합니다. 저 또한 그렇기 때문에 이번 포스팅에서는 RDBMS가 무엇인지 ? NoSQL이 무엇인지 ? 어떤 차이점을 갖고 있는지 설명해보려합니다. 데이터베이스 기초에 대한 내용은 아래 포스팅을 참고하시기 바랍니다. c 쉽게 정리하여 편하게 보실 수 있습니다. c 2022.09.21 - [CS 기초 지식/[데이터베이스]] - (데이터베이스 기초) DBMS, SQL 쉽고 간단하게 이해해보자. (데이터베이스 기초) DBMS, SQL 쉽고 간단하게 이해해보자. 데이터베이스 ( Database ) 여러 사람들이 공유하고 사용할 목적으로 통합 관리되는 ..

(javascript) 알고리즘 - 스티커 모으기 (완벽설명, 이해) [내부링크]

문제 설명 N개의 스티커가 원형으로 연결되어 있습니다. 다음 그림은 N = 8인 경우의 예시입니다. 원형으로 연결된 스티커에서 몇 장의 스티커를 뜯어내어 뜯어낸 스티커에 적힌 숫자의 합이 최대가 되도록 하고 싶습니다. 단 스티커 한 장을 뜯어내면 양쪽으로 인접해있는 스티커는 찢어져서 사용할 수 없게 됩니다. 예를 들어 위 그림에서 14가 적힌 스티커를 뜯으면 인접해있는 10, 6이 적힌 스티커는 사용할 수 없습니다. 스티커에 적힌 숫자가 배열 형태로 주어질 때, 스티커를 뜯어내어 얻을 수 있는 숫자의 합의 최댓값을 return 하는 solution 함수를 완성해 주세요. 원형의 스티커 모양을 위해 배열의 첫 번째 원소와 마지막 원소가 서로 연결되어 있다고 간주합니다. 제한 사항 sticker는 원형으로 ..

[네트워크] Class란 ? CIDR 란 ? 차이점 및 개념을 쉽게 이해해보자 (feat.서브넷팅, 슈퍼넷팅) [내부링크]

IP 란 ? IP는 8비트 씩 4자리로 이루어진 32 자리 이진수로 구성되어 있습니다. 아래 포스팅에 IPv4 와 IPv6에 대해서도 한번 읽어보시는 것을 추천 드립니다. IPv4와 IPv6 란? IPv4와 IPv6의 차이점에 대해 알아보자. IP란 ? 인터넷에 연결되어 있는 모든 장치들(컴퓨터, 서버 장비, 스마트폰 등)을 식별할 수 있도록 각각의 장비에게 부여되는 고유 주소 IP 는 IPv4 와 IPv6 두 가지로 나뉘며 일반적으로 IPv4를 많이 hstory0208.tistory.com 192.168.0.1 위 IP 주소를 예를 들어 이진수로 표현했을 땐 다음과 같습니다. 2^7 ( 128 ) 2^6 ( 64 ) 2^5 ( 32 ) 2^4 ( 16 ) 2^3 ( 8 ) 2^2 ( 4 ) 2^1 ( ..

[알고리즘] 동적 프로그래밍 (DP) 란? feat.동적 계획법 [내부링크]

동적 프로그래밍(Dynamic programming) 란? 동적 프로그래밍은 "큰 문제"를 "부분 문제"로 나누고, "부분 문제"의 정답으로 "큰 문제"의 답을 찾는 알고리즘 설계 기법입니다. 동적 프로그래밍의 대표적인 예로 피보나치 수열을 예로 들 수 있는데요, 이 점화식을 코드로 표현하면 다음과 같습니다. F[1] = 1 F[2] = 1 F[1] = F[2] F[i] = F[i-1] + F[i-2] 점화식은 재귀식이라고도 하며 위 코드를 보면 피보나치 수열은 재귀적인 관계를 가지고 있다는 것을 알 수 있습니다. DP를 적용하기 위한 2가지 조건 동적 프로그래밍을 적용시키기 위해선 다음 고같은 두 가지가 만족되어야 합니다. 부분 반복 문제(Overlapping Subproblem) 최적 부분 구조(Op..

(javascript) 알고리즘 문제 - 땅따먹기 ( 완벽이해, 설명 ) [내부링크]

문제 설명 땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(land)은 총 N행 4열로 이루어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 1행부터 땅을 밟으며 한 행씩 내려올 때, 각 행의 4칸 중 한 칸만 밟으면서 내려와야 합니다. 단, 땅따먹기 게임에는 한 행씩 내려올 때, 같은 열을 연속해서 밟을 수 없는 특수 규칙이 있습니다. 예를 들면, | 1 | 2 | 3 | 5 | | 5 | 6 | 7 | 8 | | 4 | 3 | 2 | 1 | 로 땅이 주어졌다면, 1행에서 네번째 칸 (5)를 밟았으면, 2행의 네번째 칸 (8)은 밟을 수 없습니다. 마지막 행까지 모두 내려왔을 때, 얻을 수 있는 점수의 최대값을 return하는 solution 함수를 완성해 주세요. 위 예의 경우, 1행의 네번째 칸 ..

(javascript) 알고리즘 문제 - 완전탐색 (가장 많은 문제를 맞춘 수포자 찾기) [내부링크]

문제 설명 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. ( 수포자들의 답안 패턴을 찾기 쉽도록 글자색으로 나누었습니다. ) 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ... 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이..

OSI 7 계층(OSI 7 LAYER)이란 ? 개념 및 각 계층 역할구조 까지 쉽고 간단하게 알아보자. [내부링크]

OSI 7 계층(OSI 7 LAYER)이란 ? OSI 7 계층은 네트워크에서 통신이 일어나는 과정을 7단계로 나눈 것으로 계층을 나눈 이유는 통신이 일어나는 과정을 단계별로 파악할 수 있고 7계층 중 어느 한 부분에 이상이 생겼다면 전체를 건들이지 않고 이상이 생긴 특정 부분만 고칠 수 있습니다. OSI 7 계층 우측의 실제 인터넷에서 사용되는 TCP/IP 는 OSI 참조 모델을 기반으로 상업적이고 실무적으로 이용될 수 있도록 단순화한 것입니다. 순서 목적 설명 L7 -> L1 Data 전송 전송 시 7계층에서 1계층으로 각각의 층마다 인식할 수 있어야 하는 헤더를 붙입니다. (캡슐화) L1 -> L7 Data 수신 수신 시 1계층에서 7계층으로 헤더를 떼어냅니다. (디캡슐화) 예시 PC방에서 롤을 하고..

(javascript) 알고리즘 문제 - 가장 큰 정사각형 찾기 ( 완벽이해, 설명 ) [내부링크]

문제 설명 1와 0로 채워진 표(board)가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다. 표에서 1로 이루어진 가장 큰 정사각형을 찾아 넓이를 return 하는 solution 함수를 완성해 주세요. (단, 정사각형이란 축에 평행한 정사각형을 말합니다.) 예를 들어, 1 2 3 4 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 가 있다면 가장 큰 정사각형은 1 2 3 4 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 가 되며 넓이는 9가 되므로 9를 반환해 주면 됩니다. 제한사항 표(board)는 2차원 배열로 주어집니다. 표(board)의 행(row)의 크기 : 1,000 이하의 자연수 표(board)의 열(column)의 크기 : 1,000 이하의 자연수..

(javascript) 알고리즘 문제 - 나머지 한 점 [내부링크]

문제 설명 직사각형을 만드는 데 필요한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 구하려고 합니다. 점 3개의 좌표가 들어있는 배열 v가 매개변수로 주어질 때, 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 return 하도록 solution 함수를 완성해주세요. 단, 직사각형의 각 변은 x축, y축에 평행하며, 반드시 직사각형을 만들 수 있는 경우만 입력으로 주어집니다. 제한사항 v는 세 점의 좌표가 들어있는 2차원 배열입니다. v의 각 원소는 점의 좌표를 나타내며, 좌표는 [x축 좌표, y축 좌표] 순으로 주어집니다. 좌표값은 1 이상 10억 이하의 자연수입니다. 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 [x축 좌표, y축 좌표] 순으로 담아 return 해주세요..

(javascript) 알고리즘 문제 - 자릿수 더하기 [내부링크]

문제설명 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다. 제한사항 N의 범위 : 100,000,000 이하의 자연수 입출력 예 #1 N answer 123 6 987 24 입출력 예 #2 9 + 8 + 7 = 24이므로 24를 return 하면 됩니다. solution.js function solution(n) { let answer = 0; let str = n.toString(); for (let i = 0; i < str.length; i++) { answer += parseInt(str[i]); } return answer; } 해설 1. n의 각 자릿수의..

IPv4와 IPv6 란? IPv4와 IPv6의 차이점에 대해 알아보자. [내부링크]

IP 주소 ( Internet Protocol Address ) 란 ? 인터넷에 연결되어 있는 모든 장치들(컴퓨터, 서버 장비, 스마트폰 등)을 식별할 수 있도록 각각의 장비에게 부여되는 고유 주소 네트워크 상에서 다른 PC에 접속하기 위해선, 그 PC를 가리키는 주소를 알아야합니다. 네트워크에 연결된 특정 PC의 주소를 나타내는 체계를 바로 IP 주소라고 합니다. IP 는 IPv4 와 IPv6 두 가지로 나뉘며 일반적으로 IPv4를 많이 사용합니다. 그 이유는 아래에서 설명하겠습니다. IPv4 ( Internet Protocol version 4 ) 0~255 까지의 숫자로 주소는 32bit 주소 체계로, 8비트씩 4자리 이루어진 000.000.000.000 형태로 2^32 승, 대략 43억개의 IP를..

(javascript) 알고리즘 문제 - 순열 검사 [내부링크]

문제 설명 길이가 n인 배열에 1부터 n까지 숫자가 중복 없이 한 번씩 들어 있는지를 확인하려고 합니다. 1부터 n까지 숫자가 중복 없이 한 번씩 들어 있는 경우 true를, 아닌 경우 false를 반환하도록 함수 solution을 완성해주세요. 제한사항 배열의 길이는 10만 이하입니다. 배열의 원소는 0 이상 10만 이하인 정수입니다. 입출력 예 arr result [4,1,3,2] true [4,1,3] false 입출력 예 설명 입출력 예 #1 입력이 [4, 1, 3, 2]가 주어진 경우, 배열의 길이가 4이므로 배열에는 1부터 4까지 숫자가 모두 들어 있어야 합니다. [4, 1, 3, 2]에는 1부터 4까지의 숫자가 모두 들어 있으므로 true를 반환하면 됩니다. 입출력 예 #2 [4, 1, 3]..