- problem solving 107
- Python 81
- 프로그래머스 79
- Java 45
- 우아한테크코스 22
- reading books 21
- MySQL 15
- Effective Java 14
- 백준 14
- spring 13
- review 10
- 후기 10
- 나동빈 8
- jpa 7
- kotlin 7
- SWEA 6
- docker 6
- git 6
- Agile Java 5
- Python 재무제표 크롤링 5
- etc 5
- network 5
- aws 4
- cloudfront 4
- database 4
- java 4
- websocket 4
- 생각 4
- 4학년 1학기를 돌아보며 3
- IDE 3
- exception 3
- github-actions 3
- nginx 3
- reading-books 3
- s3 3
- socket 3
- troubleshooting 3
- unit-testing 3
- 회고 3
- AWS 2
- OOP 2
- blog 2
- ec2 2
- ip address 2
- query-dsl 2
- sonarqube 2
- test 2
- validation 2
- C 1
- EC2 1
- Http상태코드 1
- JPA 1
- JUnit 5 1
- JdbcTemplate 1
- ReverseProxy 1
- Spring 1
- Spring frameworks 1
- VI/VIM 1
- WAS 1
- apache 1
- arm64 1
- cache 1
- cicd 1
- cloud 1
- code-review 1
- concurrency 1
- cookie 1
- cpu-load 1
- cpu-utilization 1
- data-class 1
- deployment 1
- design pattern 1
- dns 1
- ecs 1
- envers 1
- equals 1
- feature-toggle 1
- github 1
- github actions 1
- google 1
- gradle 1
- id-strategy 1
- infra 1
- infrastructure 1
- intellij 1
- invalidations 1
- jdk 1
- lms 1
- m1 1
- mysql 1
- oop 1
- period 1
- programming 1
- react 1
- replication 1
- scp 1
- session 1
- sonarcloud 1
- sql 1
- string 1
- terraform 1
- tomcat 1
- trouble shooting 1
- trouble-shooting 1
- unleash 1
- web-server 1
- webserver 1
- workflow 1
- x84_64 1
- 국가근로장학생 1
- 배민다움 1
- 비전공자에게 설명하기 1
- 세미나 1
- 시스템디자인 1
- 실험 1
- 열혈C프로그래밍 1
- 우아한멀티모듈 1
- 일지 1
- 정보처리기사 1
- 졸업작품 1
problem solving
[Baekjoon-1011] Fly me to the Alpha Centauri
📝 문제 https://www.acmicpc.net/problem/1011 🎯 풀이 점진적으로 워프 속도가 증가하고, 감소한다는 것에 주목해야 한다. 1 2 3 3 2 1 -- 이건 가능하지만, 1 4 2 1 -- 이건 불가능 하다. 이 때문에 첫 번째 시도로 점진적으로 증가하는 워프 속도 횟수의 절반까지만 구한 후, 이를 2배 곱하여 총 워프 횟수를...
[Java : 프로그래머스] N개의 최소공배수
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/12953?language=java 🎯 풀이 배열의 숫자 중 가장 큰 숫자를 기준 값으로 선정한다. 기준 값을 배열의 숫자들로 나눈다. 나머지가 0이 아닌 숫자가 하나라도 있을 경우, 기준 값을 +1 시키고 반복. 모든 숫자로 나눈 나머지가 0일 경우,...
[Python : 프로그래머스] 실패율
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42889 🎯 풀이 2019 KAKAO BLIND RECRUITMENT에 출제되었던 문제. 해시테이블을 이용해서 풀어냈다. def solution(N, stages): stageTable, failedTable = {}, {} stages.sort() ...
[Python : 프로그래머스] 섬 연결하기
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42861 🎯 풀이 Kruskal 알고리즘으로 풀어내면 쉬운 문제. Kruskal 알고리즘은 Union-find + Sorting 이 더해진 알고리즘이다. Union-find 없이 최저비용 연결만 진행하면 Cycle이 발생할 수 있다. 이 때문에 Uni...
[Java : 프로그래머스] 카펫
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42842?language=java 🎯 풀이 전체 카펫(사각형)의 넓이를 생각하고 접근해야 brown 개수에도 알맞는 정답이 나온다. 문제에서 구해야하는 가로, 세로 길이의 합은 (brown+4)/2 로 구할 수 있다. 더해지는 4는 모서리 4개다. c...
[Java : 프로그래머스] 소수 찾기
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42839?language=java 🎯 풀이 소수 판별은 똑똑한 수학자들이 만들어놓은 만능 풀이법이 있기 때문에 구현이 간단하다. 1은 소수가 아니다. 2는 유일한 짝수 소수다. 모든 짝수는 소수가 아니다. 그 외의 홀수는 3,5,7,9, … , 제곱근...
[Java : 프로그래머스] 네트워크
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/43162 🎯 풀이 ❌ 상하좌우 풀이 class Solution { public int solution(int n, int[][] computers) { int answer = 0; for(int x = 0; x < computers.length;...
[Java : 프로그래머스] 모의고사
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42840?language=java 🎯 풀이 단순 구현 문제. import java.util.*; class Solution { public int[] solution(int[] answers) { // 패턴 3개 초기화. int[] pattern1 =...
[Java : 프로그래머스] 프린터 🖨️
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42587?language=java 🎯 풀이 priority와 index를 한꺼번에 관리하기 위해 구조체(Class)생성. 구조체화 시킨 데이터를 Queue에 삽입. Queue 루프를 돌면서 Priority 비교 Priority가 제일 크다면, Queu...
[Java : 프로그래머스] 전화번호 목록
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42577?language=java 🎯 풀이 문제 분류는 Hash로 분류되어 있지만, 자바는 Hash없이 처리가 가능하다. 자바의 String 클래스는 접두사와 접미사 관련 메소드를 지원한다. startWith과 endWith이 그 주인공이다. 좋은 메...
[Java : 프로그래머스] 위장
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42578?language=java 🎯 풀이 점화식을 찾아내면 Hash는 그저 배열 분류용도로만 사용된다. ((모자개수 + 1) * (하의개수 + 1) * (겉온개수 + 1) * …) - 1 Hash의 value로 들어간 list나 array의 길이값+...
[Java : 프로그래머스] 완주하지 못한 선수
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42576?language=java 🎯 풀이 ❌ ArrayList를 이용한 풀이 ArrayList에 참가자 명단을 삽입한다. ArrayList에서 완주자들을 제거한다. import java.util.*; class Solution { public Str...
[Java : 프로그래머스] 다리를 지나는 트럭
문제 https://programmers.co.kr/learn/courses/30/lessons/42583?language=java 풀이 Queue로 사용할 데이터들의 전처리를 진행한다. 출발하는 트럭 배열을 Trucks Queue로 재선언한다. Bridge의 길이만큼 무게 0으로 채워둔 Bridge Queue를 선언한다. 알고리즘 시작. Bridge...
[Java : 프로그래머스] H-Index
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42747?language=java 🎯 풀이 원리는 “인용된 횟수가 N을 넘어가는 N개의 논문”을 찾는 것이다. 즉, 인용 횟수가 많은 논문부터 개수를 1개씩 카운트하면서, 인용 횟수와 논문개수 카운트가 교차하는 지점이 정답이 된다. 이를 코드로 구현하...
[Java : 프로그래머스] 체육복
문제 https://programmers.co.kr/learn/courses/30/lessons/42862 풀이 자바가 갖고 있는 자료구조나 클래스들에 익숙해지기 위해 도전했다가 int와 Integer의 차이, ArrayList 등 많이 배운 문제. 우선 틀린 풀이부터… 1차 풀이 key값을 이용한 요소제거를 위해서 Hashtable 자료구조로 접근했...
[Java : 프로그래머스] 주식가격
문제 https://programmers.co.kr/learn/courses/30/lessons/42584?language=java 풀이 시간을 기록할 빈 배열을 선언한다. 탐색(루프) 진행. 뒤에 남은 원소만큼 증가연산을 진행한다. 뒤에 남은 원소 중 더 작은 원소를 발견하면 루프를 탈출한다! class Solution { public int[] s...
[Java : 프로그래머스] 기능개발
문제 https://programmers.co.kr/learn/courses/30/lessons/42586?language=java 풀이 가장 앞에 들어있는 요소를 이용해야하므로, 큐를 이용해 접근해야한다. ((100 - 진행량) / 작업속도)의 올림 값(남은일)을 구한다. 큐가 비어있지 않고, 큐의 가장 앞의 값보다 방금 구한 값이 더 클 경우! 큐...
[Java : 프로그래머스] 가장 큰 수
내 블로그에 처음으로 댓글이 달렸던 그 문제! 이번엔 자바로 풀어보자. 문제 https://programmers.co.kr/learn/courses/30/lessons/42746 풀이 1차 풀이 Hastable을 이용한 접근을 시도했다. Key에는 4자리수 이상으로 키워낸 문자열 대입. Value에는 원본 정수모양 문자열 대입. Key 기준 내림차순 ...
[Java : 프로그래머스] K번째수
문제 https://programmers.co.kr/learn/courses/30/lessons/42748?language=java 풀이 문제 지문 그대로 구현하면 된다. import java.util.*; class Solution { public int[] solution(int[] array, int[][] commands) { // 정답 배열 ...
[Java : 프로그래머스] 2016년
NHN 코딩테스트를 앞두고 있는데, C, C++, Java 3개 언어로만 응시가 가능하다. 임베디드 과목 수강하면서 꾸준히 사용했던 C로 응시할까 했는데, Java에 익숙해 질 겸 Java 응시를 결정했다. 문제 https://programmers.co.kr/learn/courses/30/lessons/12901?language=java# 풀이 cla...
[Python : SWEA 3752] 가능한 시험 점수
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWHPkqBqAEsDFAUn&categoryId=AWHPkqBqAEsDFAUn&categoryType=CODE 풀이 문제를 맞추는 개수부터 생각하면 접근 할 수 있다. 문제별 점수부터 생각하면 ...
[Python : SWEA 1984] 중간 평균값 구하기
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pw_-KAdcDFAUq&categoryId=AV5Pw_-KAdcDFAUq&categoryType=CODE 풀이 최대값, 최소값 소거를 위해 오름차순 정렬 최좌측(최소값)과 최우측(최대값)을...
[Python : SWEA 10805] 야바위
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXTC3GH6D-EDFASe&categoryId=AXTC3GH6D-EDFASe&categoryType=CODE 풀이 현재 풀이에 실패한 상태다. 나중에 여유가 생기면 다시 도전해보자. 초기 접근...
[Python : SWEA 10804] 문자열의 거울상
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXTC0x16D8EDFASe 풀이 입력 받은 문자열을 뒤집는다. 뒤집힌 문자열에서 b <–> d, p <–> q 변환을 진행한다. T = int(input()) for test_case ...
[Python : SWEA 10505] 소득 불균형
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXNP4CvauaMDFAXS&categoryId=AXNP4CvauaMDFAXS&categoryType=CODE 풀이 비교하면서 카운팅을 진행하고, 카운팅 된 결과를 출력하면 된다. T = int...
[Python : SWEA 10200] 구독자 전쟁
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXMCXV_qVgkDFAWv&categoryId=AXMCXV_qVgkDFAWv&categoryType=CODE 풀이 최초 풀이 최초에 경우 수를 잘못 나눴다. 최대값이 무조건 min(A,B)인 ...
[Python : 백준 2630] 색종이 만들기
문제 https://www.acmicpc.net/problem/2630 풀이 최초 풀이 0, 0 좌표의 값을 저장한다. x, y 좌표까지 모두 훑으면서 0, 0 좌표와 색을 비교한다. 다른 값 발견시 4분면으로 분화시켜서 재귀를 돌린다. def slice(fromx, tox, fromy, toy): global paper, white, blue col...
[Python : 백준 9012] 괄호
문제 https://www.acmicpc.net/problem/9012 풀이 프로그래머스에서도 비슷한걸 풀었던 기억이 난다. 그때는 정수 값 +,- 로 구현 했던거 같은데… 이번에는 스택을 이용해보았다. lines = int(input()) commands = [] for _ in range(lines): commands.append(input()) ...
[Python : 백준 4949] 균형잡힌 세상
문제 https://www.acmicpc.net/problem/4949 풀이 단순 구현 문제. 정규표현식을 이용해 ()[] 만 남기는걸로 구현해보았다. import re lines = [] while True: getstring = input() if getstring == ".": break lines.append(getstring) for line...
[Python : 백준 4673] 셀프 넘버
문제 https://www.acmicpc.net/problem/4673 풀이 1~10000 까지의 값을 배열에 저장한다. 1~10000 까지 루프를 돌면서 셀프넘버를 구한다. 구한 셀프넘버를 배열에서 소거시킨다. 배열에 남은 값들을 출력시킨다. 각각의 셀프 넘버는 값이 들쭉날쭉하게 만들어지고 소거시키는 동작이 엄청 많은 시간을 잡아먹기 때문에 딕셔너리...
[Python : 백준 1874] 스택 수열
문제 https://www.acmicpc.net/problem/1874 풀이 지문이 난해해서 한참 봤던 문제. 설명이 조금 더 상세했으면 좋겠다. 1~N 까지 랜덤한 수를 입력 받는다. 1~N 까지 오름차순으로 스택에 push하면서, 입력 받은 랜덤 수를 pop한다. 스택에서 pop 해낼 수 없는 경우 “NO” 출력 n = int(input()) se...
[Python : 백준 11729] 하노이 탑 이동 순서
문제 https://www.acmicpc.net/problem/11729 풀이 하노이 탑에 대해서는 위키를 참고하자. 문제의 출력 예시에서 규칙을 찾아낼 수 있다. 하노이 탑 봉을 left, mid, right로 표기하고 설명하겠다. # 입력 예시 3 # 출력 예시 7 1 3 #1 1 2 #2 3 2 #3 1 3 #4 2 1 #5 2 3 #6 1 3 ...
[Python : 백준 10828] 스택
문제 https://www.acmicpc.net/problem/10828 풀이 단순 구현 문제. 명령어별 예외처리에 주의해서 구현하면 된다. #1, #2 로 구분해서 구현해봤는데 모두 잘 되는 것 같다. lines = int(input()) commands = [] stack = [] for i in range(lines): commands.appen...
[Python : 백준 10773] 제로
문제 https://www.acmicpc.net/problem/10773 풀이 기본 스택 구현. 0을 입력 받으면 pop 그 외엔 push 마지막에 스택의 합을 출력 stack = [] lines = int(input()) for i in range(lines): number = int(input()) if number == 0: stack.pop()...
[Python : 백준 1065] 한수
문제 https://www.acmicpc.net/problem/1065 풀이 입력되는 N의 최대 크기가 1000이기 때문에, 한수에 대한 특징만 이해한다면 어렵지 않게 구현이 가능하다. 1~9 까지의 한 자리수는 모두 한수로 취급된다. (비교자리수가 없음) 10~99 까지의 두 자리수는 모두 한수로 취급된다. (비교가 1회로 끝남) 100 이상부터의 ...
[Python : 프로그래머스] 튜플
문제 https://programmers.co.kr/learn/courses/30/lessons/64065?language=python3 풀이 정규표현식으로 },{ 이랑 , 를 제거한다. 해시테이블로 각 숫자의 개수를 체크해낸다. 해시테이블의 내림차순으로 반환한다. import re def solution(s): news = re.sub('[{}]',...
[Python : 프로그래머스] 여행경로
문제 https://programmers.co.kr/learn/courses/30/lessons/43164?language=python3 풀이 재귀 DFS로 풀려하다가, 계속 머리속에서 꼬이는 바람에 그냥 스택으로 풀어냈다. 이게 속편한거 같다 ㅡㅡ;; 티켓을 ‘출발지:도착지1,도착지2,…’ 해시테이블로 변환한다. 여행경로가 2가지 이상 등장할 경우 ...
[Python : 백준 1931] 회의실배정
문제 https://www.acmicpc.net/problem/1931 한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중...
[Python : 백준 1541] 잃어버린 괄호
문제 https://www.acmicpc.net/problem/1541 풀이 괄호 개수 제한이 없기 때문에 ‘-‘를 발견하면, 이후 연산을 모두 뺄셈으로 바꿀 수 있다. 이를 코드로 옮길 때 ‘-‘를 발견하기 전 값은 더해주고 ‘-‘를 발견한 이후 값은 모두 빼주면 된다. line = input().split('-') total = 0 for i in...
[Python : 백준 11399] ATM
문제 https://www.acmicpc.net/problem/11399 풀이 지문에서 모든 힌트를 다 줬기 때문에, 그대로 코드에 옮기기만 하면 되는데 제한조건만 잘 확인하면 점화식까지 세울 필요도 없었다. 1초 제한에 N의 최대가 1,000이었기 때문에 그냥 O(n)시간 풀이로 해결해도 된다. N = int(input()) time = sorted...
[Python : 백준 11047] 동전 0
문제 https://www.acmicpc.net/problem/11047 준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다. 동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오. # 입력 예시 10 4200 1 5 10 50 100 500 1000 5...
[Python : 나동빈] 음료수 얼려 먹기
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) N * M 행렬을 입력 받는다. 행렬상의 0은 음료얼음, 1은 플라스틱 0이 이어지면 한 덩어리로 취급한다. 음료얼음 덩어리는 총 몇 개인가? # 입력 예시 4 5 00110 00011 11111 00000 # 출력 예시 3 풀이 DFS로 푸는게 적합해 보였다. 0과 1로 이루어진 ...
[Python : 나동빈] 왕실의 나이트
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 8 * 8 크기의 체스판 좌표를 입력 받으면, 나이트가 움직일 수 있는 경우의 수 구하기 # 체스판 예시 a b c d e f g h 1 - - - - - - - - 2 - - - - - - - - 3 - - - - - - - - 4 - - - - - - - - 5 - - - - -...
[Python : 나동빈] 시각
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중 3이 하나라도 포함되는 모든 경우의 수를 구하라. # 입력 예시 5 # 출력 예시 11475 풀이 1 시간은 3,600초다. 03시, 13시, 23시는 무조건 3,600개의 3을 마주친다. 그 외 시...
[Python : 나동빈] 상하좌우
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) N * N 행렬 좌표 가장 좌측 상단 좌표는 1,1 가장 우측 하단 좌표는 N,N 로 표기한다. N 길이의 입력에는 L(left), R(right), U(up), D(down) 이 들어있다. 좌표를 초과하는 이동은 무시한다. 예를 들어 1,1에서 L,U를 입력 받으면 이동하지 않는다...
[Python : 나동빈] 미로 탈출
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) N * M 행렬 미로 1은 길, 0은 벽 1,1 지점부터 N, M 지점까지 이동하는데 필요한 최저횟수를 구하라. # 입력 예시 5 6 101010 111111 000001 111111 111111 # 출력 예시 10 풀이 BFS에 익숙하지 않아 답안 코드를 많이 참고했다. BFS에는...
[Python : 나동빈] 문자열 재정렬
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 알파벳 대문자와 숫자(0~9)로만 이루어진 문자열이 주어진다. 이 문자열을 알파벳 오름차순으로 정렬하고, 숫자는 모두 더해서 뒤에 붙여라. # 입력 예시 K1KA5CB7 # 출력 예시 ABCKK13 풀이 파이썬 sorted 함수는 숫자와 문자가 섞여있는 리스트에서 숫자를 앞쪽으로, ...
[Python : 나동빈] 모험가 길드
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 한 마을에 모험가가 N명 모험가별로 가지고 있는 ‘공포도’가 다르다. 공포도가 X인 모험가는 반드시 X명 이상으로 구성한 모험가 그룹에 참여 최대 몇 그룹이 탄생하는가 # 입력 예시 5 2 3 1 2 2 # 출력 예시 2 풀이 문제 지문이 애매해서 예시를 보고서야 이해했던 문제 “최...
[Python : 나동빈] 곱하기 혹은 더하기
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 각 자리가 숫자(0부터 9)로만 이루어진 문자열 S가 주어졌을 때, 왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며 숫자 사이에 ‘*’ 혹은 ‘+’ 연산자를 넣어 결과적으로 만들어질 수 있는 가장 큰 수를 구하는 프로그램을 작성하세요. 단, +보다 X를 먼저 계산하는 일반적인 방식과...
[SQL : 프로그래머스] 중성화 여부 파악하기
문제 https://programmers.co.kr/learn/courses/30/lessons/59409 풀이 SELECT ANIMAL_ID, NAME, IF(SEX_UPON_INTAKE LIKE 'Intact%', 'X', 'O') AS 중성화 FROM ANIMAL_INS ORDER BY ANIMAL_ID IF 절을 사용할 줄 안다면 쉽게 풀 수 ...
[SQL : 프로그래머스] 있었는데요 없었습니다
문제 https://programmers.co.kr/learn/courses/30/lessons/59043?language=mysql 풀이 SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME FROM ANIMAL_INS JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID=ANIMAL_OUTS.ANIMA...
[SQL : 프로그래머스] 입양 시각 구하기(2)
문제 https://programmers.co.kr/learn/courses/30/lessons/59413?language=mysql 풀이 갑자기 안풀려서 답답했던 문제였는데, 알고보니 LEVEL 4 였다더라~ SET을 통해 변수를 설정해야 쉽게 풀 수 있는 문제였다. SET @hour := -1; SELECT (@hour := @hour+1) as ...
[SQL : 프로그래머스] 오랜 기간 보호한 동물(2)
문제 https://programmers.co.kr/learn/courses/30/lessons/59411 풀이 SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME FROM ANIMAL_INS INNER JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID=ANIMAL_OUTS.ANIMAL_ID ORDE...
[SQL : 프로그래머스] 오랜 기간 보호한 동물(1)
문제 https://programmers.co.kr/learn/courses/30/lessons/59044 풀이 SELECT ANIMAL_INS.NAME, ANIMAL_INS.DATETIME FROM ANIMAL_INS LEFT JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID=ANIMAL_OUTS.ANIMAL_ID WHERE ...
[SQL : 프로그래머스] 보호소에서 중성화한 동물
문제 https://programmers.co.kr/learn/courses/30/lessons/59045 풀이 중요한 것을 잃은 문제! SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.ANIMAL_TYPE, ANIMAL_INS.NAME FROM ANIMAL_INS INNER JOIN ANIMAL_OUTS ON ANIMAL_IN...
[SQL : 프로그래머스] DATETIME에서 DATE로 형 변환
문제 https://programmers.co.kr/learn/courses/30/lessons/59414 풀이 SELECT ANIMAL_ID, NAME, date_format(DATETIME, '%Y-%m-%d') AS '날짜' FROM ANIMAL_INS ORDER BY ANIMAL_ID 쉬운 문제의 경우 되도록 포스팅을 자제하려고 하는데 date...
[Python : 프로그래머스] 영어 끝말잇기
문제 https://programmers.co.kr/learn/courses/30/lessons/12981?language=python3 풀이 def solution(n, words): preword = {words[0]:1} for i in range(1, len(words)): if words[i-1][-1] != words[i][0] or wor...
[Python : 프로그래머스] 땅따먹기
문제 https://programmers.co.kr/learn/courses/30/lessons/12913 풀이 문제에 제시된 조건을 읽자마자 각 행을 내림차순으로 정렬해서 이전 행에서 가져온 최대값과 열이 같으면 바로 다음 값을 찾는 식으로 구현했다. def solution(land): answer, preidx = 0, -1 land = [sort...
[SQL : 프로그래머스] 중복 제거하기
문제 https://programmers.co.kr/learn/courses/30/lessons/59408 풀이 SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME!='' 중복제거가 DISTINCT인건 인지하고 있었는데, COUNT함수로 묶을 수 있다는 건 테스트하면서 깨달았다. NULL은 역시 그대로 쓰...
[SQL : 프로그래머스] 입양 시각 구하기(1)
문제 https://programmers.co.kr/learn/courses/30/lessons/59412?language=mysql 풀이 SELECT HOUR(DATETIME), COUNT(HOUR(DATETIME)) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19 ...
[SQL : 프로그래머스] 없어진 기록 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/59042 풀이 SELECT ANIMAL_ID, NAME FROM ANIMAL_OUTS WHERE ANIMAL_ID NOT IN ( SELECT ANIMAL_ID FROM ANIMAL_INS) JOIN 으로 풀기가 권장되는 문제지만, IN 을 알고 있다면 ...
[SQL : 프로그래머스] 상위 n개 레코드
문제 https://programmers.co.kr/learn/courses/30/lessons/59405 풀이 SELECT NAME FROM ANIMAL_INS WHERE DATETIME=(SELECT MIN(DATETIME) FROM ANIMAL_INS) SELECT 구절이 두 번 사용된다는 것은 아쉽지만, MIN 함수를 이용해서 최소값을 잡아내는...
[SQL : 프로그래머스] 동명 동물 수 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/59041 풀이 SELECT NAME, COUNT(NAME) FROM ANIMAL_INS GROUP BY NAME HAVING COUNT(NAME) > 1 ORDER BY NAME WHERE 는 집계함수를 사용 할 수 없다. HAVING 은 집계함수를...
[SQL : 프로그래머스] 고양이와 개는 몇 마리 있을까
문제 https://programmers.co.kr/learn/courses/30/lessons/59040 풀이 SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) FROM ANIMAL_INS GROUP BY ANIMAL_TYPE ORDER BY ANIMAL_TYPE 갑작스럽게 GROUP BY가 떠오르지 않아 질문 게시판을 참고했다....
[SQL : 프로그래머스] NULL 처리하기
문제 https://programmers.co.kr/learn/courses/30/lessons/59410 풀이 SELECT ANIMAL_TYPE, IF(NAME IS NULL, 'No name', NAME) AS NAME, SEX_UPON_INTAKE FROM ANIMAL_INS IF문을 이용해서 NAME IS NULL이 참이라면 No name, 아...
[Python : 프로그래머스] 최댓값과 최솟값
문제 https://programmers.co.kr/learn/courses/30/lessons/12939?language=python3 풀이 문자열을 split 함수를 이용하면 공백문자 단위로 쪼갤 수 있고, map 함수로 쪼개진 리스트를 정수형으로 변환시키면, min/max 함수 사용이 가능해진다. 그걸 다시 str 함수로 묶어서 문자열 정답으로 ...
[Python : 프로그래머스] 올바른 괄호
문제 https://programmers.co.kr/learn/courses/30/lessons/12909?language=python3 풀이 ’(‘와 ‘)’ 의 갯수부터 맞지 않는다면 탐색할 필요 없이 바로 False를 반환한다. 제한사항과 입출력 예시에서 말하는 올바른 괄호는 우리가 흔히 아는 그 괄호 방식이다. 즉, 단 한 번이라도 ‘)’가 더 ...
[Python : 프로그래머스] 가장 큰 정사각형 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/12905?language=python3 풀이 우선 처음에 잘못 접근했던 코드부터 기록해볼까 한다. def solution(board): cube = [0] * len(board[0]) for row in board : cube = [c+r for c,r ...
[Python : 프로그래머스] 최솟값 만들기
문제 https://programmers.co.kr/learn/courses/30/lessons/12941?language=python3 풀이 곱셈의 특성을 생각하면 어떻게 접근해야할지 파악이 가능한 문제다. 최대값은 될 수 있는한 최소값으로 곱하고, 최소값을 최대값으로 곱해줘야 누적결과가 최소로 나온다. def solution(A,B): answer...
[Python : 프로그래머스] 다음 큰 숫자
문제 https://programmers.co.kr/learn/courses/30/lessons/12911?language=python3 풀이 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다. 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장...
[Python : 프로그래머스] 폰켓몬
문제 https://programmers.co.kr/learn/courses/30/lessons/1845 풀이 nums result [3,1,2,3] 2 [3,3,3,2,2,4] 3 [3,3,3,2,2,2] 2 우선 곧장 모든 조합을 구하는 것은 굉장히 무거우므로 배제한다. 안봐도 시간초과가 수두룩 하게 뜰 것이다. “nums를 바로 중복배제 시킨 다...
[Python : 프로그래머스] 정수 삼각형
문제 https://programmers.co.kr/learn/courses/30/lessons/43105?language=python3 풀이 대게 이런 삼각형 문제들은 행 단위로 구분시켰을 때 위 아래 행 간의 구성에 대해 이해하면 풀이가 시작되는 것 같다. [7] ---------- 0 [3, 8] -------- 1 [8, 1, 0] ------...
[Python : 프로그래머스] 오픈채팅방
문제 https://www.welcomekakao.com/learn/courses/30/lessons/42888?language=python3 풀이 #input ["Enter uid1234 Muzi", "Enter uid4567 Prodo", "Leave uid1234", "Enter uid1234 Prodo", "Change uid4567 Ryan"...
[Python : 프로그래머스] 스킬트리
문제 https://programmers.co.kr/learn/courses/30/lessons/49993?language=python3 풀이 def solution(skill, skill_trees): answer = 0 for tree in skill_trees : idx = 0 for t in tree : if t in skill : if ski...
[Python : 프로그래머스] 서울에서 김서방 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/12919 풀이 def solution(seoul): return "김서방은 "+str(seoul.index("Kim"))+"에 있다" 사실 LEVEL 1 문제를 마주할 때마다 “그냥 건너뛸까?” 라는 생각을 하지만 다른 사람의 풀이 중에 배울게 있지 않을...
[Python : 프로그래머스] 멀쩡한 사각형
문제 https://programmers.co.kr/learn/courses/30/lessons/62048?language=python3 풀이 처음에 문제를 읽고 예시그림이 너무 간결해서 눈을 의심했지만, 그렇게 간결한 예시그림을 준 이유는 무엇이겠는가? 수학적으로 접근해서 해결 하라는 것이겠지. 결국 수학적으로 접근해서 해결하면 쉽게 해결되는 문제였...
[Python : 프로그래머스] 멀리 뛰기
문제 https://programmers.co.kr/learn/courses/30/lessons/12914 풀이 멀리 뛰기 칸이 1개 일때부터 조합의 수를 나열해보자. 1 -- [1] -- 1 2 -- [1,1][2] -- 2 3 -- [1,1,1][1,2][2,1] -- 3 4 -- [1,1,1,1][1,1,2][1,2,1][2,1,1][2,2] -...
[Python : 프로그래머스] 구명보트
문제 https://programmers.co.kr/learn/courses/30/lessons/42885?language=python3 풀이 조이스틱에서 피본거에 비하면 20분만에 쉽게 풀어낸 문제. 피본 덕분에 실력이 늘은건가? from collections import deque def solution(people, limit): dp = de...
[Python : 프로그래머스] 124 나라의 숫자
문제 https://programmers.co.kr/learn/courses/30/lessons/12899 풀이 1, 2, 4 로 이루어진 3진수 숫자로 10진수를 변환시키는 문제. 단, 우리가 아는 8진수 16진수는 0~7, 0~15로 이루어져있는데, 124 나라의 3진수는 1, 2, 4 로 이루어져 있다. 이 때문에 4, 1, 2 로 변환하여 시도...
[Python : 프로그래머스] 큰 수 만들기
문제 https://programmers.co.kr/learn/courses/30/lessons/42883?language=python3 풀이 from itertools import combinations def solution(number, k): lst = list(combinations(range(len(number)), len(number)-k...
[Python : 프로그래머스] 조이스틱
문제 https://programmers.co.kr/learn/courses/30/lessons/42860 풀이 LEVEL 2인거 보고 덤볐다가 3시간 넘게 피본 문제 def solution(name): name = list(name) total = 0 i = 0 while True : # 상하 조작 total += min(ord(name[i])-65...
[Python : 프로그래머스] 더 맵게
문제 https://programmers.co.kr/learn/courses/30/lessons/42626?language=python3 풀이 최소/최대 값을 계속 사용하는 알고리즘이다? –> Heap 자료구조. 파이썬 내장모듈 heapq를 통해 구현했다. Heap 자료구조가 궁금하거나 직접 구현해야한다면 [자료구조] 힙(heap)이란 - Hee...
[Python : 프로그래머스] 단어 변환
문제 https://programmers.co.kr/learn/courses/30/lessons/43163?language=python3 풀이 최초 시도 def DFS(compw, words, count): for w in range(len(words)): if len([d for d in range(len(word)) if words[d] != co...
[Python : 프로그래머스] 크레인 인형뽑기 게임
문제 https://programmers.co.kr/learn/courses/30/lessons/64061 풀이 def solution(board, moves): answer = 0 stack = [] ht = {} for mov in moves : if not mov in ht : ht[mov] = [i[mov-1] for i in board if ...
[Python : 프로그래머스] 체육복
문제 https://programmers.co.kr/learn/courses/30/lessons/42862?language=python3 풀이 def solution(n, lost, reserve): ht = {} for i in range(1, n+1): ht[i] = 1 if i in lost : ht[i] -= 1 if i in reserve :...
[Python : 프로그래머스] 문자열 다루기 기본
문제 https://programmers.co.kr/learn/courses/30/lessons/12918?language=python3 풀이 def solution(s): return s.isdigit() and (len(s) == 4 or len(s) == 6) 더 나은 풀이 def solution(s): return s.isdigit() and ...
[Python : 프로그래머스] 문자열 내림차순으로 배치하기
문제 https://programmers.co.kr/learn/courses/30/lessons/12917?language=python3 풀이 def solution(s): return "".join(sorted(s, reverse=True)) 문제 조건 중에 “대문자는 더 작은 것으로 간주합니다.”가 있길레 ASCII를 기준으로 정렬되겠거니 하고 r...
[Python : 프로그래머스] 문자열 내 마음대로 정렬하기
문제 https://programmers.co.kr/learn/courses/30/lessons/12915?language=python3 풀이 def solution(strings, n): return sorted(sorted(strings), key=lambda x: x[n]) sorted 함수는 기본적으로 완전정렬이므로, 한 번 단어의 사전 순으로...
[Python : 프로그래머스] 문자열 내 p와 y의 개수
문제 https://programmers.co.kr/learn/courses/30/lessons/12916?language=python3 풀이 def solution(s): return s.lower().count('p') == s.lower().count('y') 점점 파이써닉이 손에 익는거 같다! 중고딩 땐 “갯수”가 표준어였는데, 새내기 때 “개...
[Python : 프로그래머스] 두 정수 사이의 합
문제 https://programmers.co.kr/learn/courses/30/lessons/12912?language=python3 풀이 def solution(a, b): return sum([i for i in range(min(a,b), max(a,b)+1)]) 더 나은 풀이 def adder(a, b): return sum(range(mi...
[Python : 프로그래머스] 두 개 뽑아서 더하기
문제 https://programmers.co.kr/learn/courses/30/lessons/68644?language=python3 풀이 def solution(numbers): from itertools import combinations return sorted(list(set(map(lambda x: x[0]+x[1],list(combina...
[Python : 프로그래머스] 나누어 떨어지는 숫자 배열
문제 https://programmers.co.kr/learn/courses/30/lessons/12910 풀이 def solution(arr, divisor): answer = sorted([i for i in arr if i%divisor == 0]) return answer if len(answer) > 0 else [-1] 아 참 잘풀었다...
[Python : 프로그래머스] 같은 숫자는 싫어
문제 https://programmers.co.kr/learn/courses/30/lessons/12906 풀이 def solution(arr): a = [] for i in arr : if len(a) < 1 or a[-1] != i : a.append(i) return a 더 나은 풀이 def no_continuous(s): a = [] fo...
[Python : 프로그래머스] 가운데 글자 가져오기
문제 https://programmers.co.kr/learn/courses/30/lessons/12903 풀이 def solution(s): if len(s) % 2 : return s[len(s)//2] else : return s[len(s)//2-1:len(s)//2+1] 최고는 아니겠지만 이정도면 그래도 짧은 편이지 않을까 했다. 더 나은 풀...
[Python : 프로그래머스] 2016년
문제 https://programmers.co.kr/learn/courses/30/lessons/12901 풀이 def solution(a, b): week = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"] month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] ...
[Python : 프로그래머스] 타겟 넘버
문제 https://programmers.co.kr/learn/courses/30/lessons/43165 풀이 def solution(numbers, target): from itertools import product pm = [(num, -num) for num in numbers] answer = list(map(sum, product(*pm)...
[Python : 프로그래머스] 카펫
문제 https://programmers.co.kr/learn/courses/30/lessons/42842?language=python3 풀이 def solution(brown, yellow): total = brown + yellow cd = [i for i in range(2,total) if total % i == 0] if len(cd) % 2...
[Python : 프로그래머스] 네트워크
문제 https://programmers.co.kr/learn/courses/30/lessons/43162 풀이 DFS로 경로가 몇 개인지 찾는 문제 보통 DFS가 무한루프에 빠지지 않도록 방문내역을 확인하는데, 모든 노드에 대해서 방문기록이 있는지 확인하고, 없으면 DFS 진행시키면서 경로개수를 증가시켜서 해결한다. def DFS(i, visited...
[Python : 프로그래머스] 프린터
문제 https://programmers.co.kr/learn/courses/30/lessons/42587?language=python3 풀이 def solution(priorities, location): op = priorities[location] lst = sorted(list(enumerate(priorities)), key=lambda x:...
[Python : 프로그래머스] 소수 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/42839 풀이 from itertools import permutations def isPrime(n: int) -> bool: if n < 2 : return False for i in range(2, n) : if n%i == 0 : ret...
[Python : 프로그래머스] 모의고사
문제 https://programmers.co.kr/learn/courses/30/lessons/42840?language=python3 풀이 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 지문이 웃겼던 문제 def solution(...
[Python : 프로그래머스] 다리를 지나는 트럭
문제 https://programmers.co.kr/learn/courses/30/lessons/42583 풀이 문제를 처음 읽었을 당시 실제로 큐에 값이 차례로 Insert / POP 되는 형태보다 weight를 넘지 않는 인접값끼리 한 꺼번에 처리하면 좋지 않을까 하며 그림을 그려봤다. truck_weights : [7, 4, 5, 1, 6] br...
[Python : 프로그래머스] 주식가격
문제 https://programmers.co.kr/learn/courses/30/lessons/42584 풀이 def solution(prices): answer = [0] prices.reverse() print(prices) for i in range(1, len(prices)) : if prices[i] > prices[i-1] : ans...
[Python : 프로그래머스] 베스트앨범
문제 https://programmers.co.kr/learn/courses/30/lessons/42579 풀이 ‘이건 알고리즘보다 자료구조에 치중된 문제가 아닌가?’ 생각하면서 다 풀고 보니까 3레벨 문제였네. ‘설마 이중해시일까?, 아니겠지’ 하면서 계속 고민 해봤지만 결국 이중해시로 해결한 문제였다. 알고리즘 자체는 어려울게 없었으나 파이썬 이중...
[Python : 프로그래머스] 기능개발
문제 https://programmers.co.kr/learn/courses/30/lessons/42586 풀이 def solution(progresses, speeds): import math answer = [] Q = [] for p, s in zip(progresses, speeds) : day = math.ceil((100-p)/s) if n...
[Python : 프로그래머스] H-Index
문제 https://programmers.co.kr/learn/courses/30/lessons/42747 풀이 def solution(citations): citations = sorted(citations) answer = 0 for i in range(len(citations)) : if i+1 >= citations[i] : answer ...
[Python : 프로그래머스] 가장 큰 수
문제 https://programmers.co.kr/learn/courses/30/lessons/42746 풀이 가장 단순하게 떠올린 방법은 itertools 라이브러리의 permutations 함수를 이용해서 모든 조합을 구한다음 비교하는 것이었는데, 대부분의 탐색 알고리즘은 O(nlogn)을 넘어가지 않게 구현해야 한다. 이 때문에 이 방식은 완전...
Python
[Python : 프로그래머스] 실패율
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42889 🎯 풀이 2019 KAKAO BLIND RECRUITMENT에 출제되었던 문제. 해시테이블을 이용해서 풀어냈다. def solution(N, stages): stageTable, failedTable = {}, {} stages.sort() ...
[Python : 프로그래머스] 섬 연결하기
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42861 🎯 풀이 Kruskal 알고리즘으로 풀어내면 쉬운 문제. Kruskal 알고리즘은 Union-find + Sorting 이 더해진 알고리즘이다. Union-find 없이 최저비용 연결만 진행하면 Cycle이 발생할 수 있다. 이 때문에 Uni...
[Python : SWEA 3752] 가능한 시험 점수
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWHPkqBqAEsDFAUn&categoryId=AWHPkqBqAEsDFAUn&categoryType=CODE 풀이 문제를 맞추는 개수부터 생각하면 접근 할 수 있다. 문제별 점수부터 생각하면 ...
[Python : SWEA 1984] 중간 평균값 구하기
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pw_-KAdcDFAUq&categoryId=AV5Pw_-KAdcDFAUq&categoryType=CODE 풀이 최대값, 최소값 소거를 위해 오름차순 정렬 최좌측(최소값)과 최우측(최대값)을...
[Python : SWEA 10805] 야바위
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXTC3GH6D-EDFASe&categoryId=AXTC3GH6D-EDFASe&categoryType=CODE 풀이 현재 풀이에 실패한 상태다. 나중에 여유가 생기면 다시 도전해보자. 초기 접근...
[Python : SWEA 10804] 문자열의 거울상
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXTC0x16D8EDFASe 풀이 입력 받은 문자열을 뒤집는다. 뒤집힌 문자열에서 b <–> d, p <–> q 변환을 진행한다. T = int(input()) for test_case ...
[Python : SWEA 10505] 소득 불균형
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXNP4CvauaMDFAXS&categoryId=AXNP4CvauaMDFAXS&categoryType=CODE 풀이 비교하면서 카운팅을 진행하고, 카운팅 된 결과를 출력하면 된다. T = int...
[Python : SWEA 10200] 구독자 전쟁
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXMCXV_qVgkDFAWv&categoryId=AXMCXV_qVgkDFAWv&categoryType=CODE 풀이 최초 풀이 최초에 경우 수를 잘못 나눴다. 최대값이 무조건 min(A,B)인 ...
[Python : 백준 2630] 색종이 만들기
문제 https://www.acmicpc.net/problem/2630 풀이 최초 풀이 0, 0 좌표의 값을 저장한다. x, y 좌표까지 모두 훑으면서 0, 0 좌표와 색을 비교한다. 다른 값 발견시 4분면으로 분화시켜서 재귀를 돌린다. def slice(fromx, tox, fromy, toy): global paper, white, blue col...
[Python : 백준 9012] 괄호
문제 https://www.acmicpc.net/problem/9012 풀이 프로그래머스에서도 비슷한걸 풀었던 기억이 난다. 그때는 정수 값 +,- 로 구현 했던거 같은데… 이번에는 스택을 이용해보았다. lines = int(input()) commands = [] for _ in range(lines): commands.append(input()) ...
[Python : 백준 4949] 균형잡힌 세상
문제 https://www.acmicpc.net/problem/4949 풀이 단순 구현 문제. 정규표현식을 이용해 ()[] 만 남기는걸로 구현해보았다. import re lines = [] while True: getstring = input() if getstring == ".": break lines.append(getstring) for line...
[Python : 백준 4673] 셀프 넘버
문제 https://www.acmicpc.net/problem/4673 풀이 1~10000 까지의 값을 배열에 저장한다. 1~10000 까지 루프를 돌면서 셀프넘버를 구한다. 구한 셀프넘버를 배열에서 소거시킨다. 배열에 남은 값들을 출력시킨다. 각각의 셀프 넘버는 값이 들쭉날쭉하게 만들어지고 소거시키는 동작이 엄청 많은 시간을 잡아먹기 때문에 딕셔너리...
[Python : 백준 1874] 스택 수열
문제 https://www.acmicpc.net/problem/1874 풀이 지문이 난해해서 한참 봤던 문제. 설명이 조금 더 상세했으면 좋겠다. 1~N 까지 랜덤한 수를 입력 받는다. 1~N 까지 오름차순으로 스택에 push하면서, 입력 받은 랜덤 수를 pop한다. 스택에서 pop 해낼 수 없는 경우 “NO” 출력 n = int(input()) se...
[Python : 백준 11729] 하노이 탑 이동 순서
문제 https://www.acmicpc.net/problem/11729 풀이 하노이 탑에 대해서는 위키를 참고하자. 문제의 출력 예시에서 규칙을 찾아낼 수 있다. 하노이 탑 봉을 left, mid, right로 표기하고 설명하겠다. # 입력 예시 3 # 출력 예시 7 1 3 #1 1 2 #2 3 2 #3 1 3 #4 2 1 #5 2 3 #6 1 3 ...
[Python : 백준 10828] 스택
문제 https://www.acmicpc.net/problem/10828 풀이 단순 구현 문제. 명령어별 예외처리에 주의해서 구현하면 된다. #1, #2 로 구분해서 구현해봤는데 모두 잘 되는 것 같다. lines = int(input()) commands = [] stack = [] for i in range(lines): commands.appen...
[Python : 백준 10773] 제로
문제 https://www.acmicpc.net/problem/10773 풀이 기본 스택 구현. 0을 입력 받으면 pop 그 외엔 push 마지막에 스택의 합을 출력 stack = [] lines = int(input()) for i in range(lines): number = int(input()) if number == 0: stack.pop()...
[Python : 백준 1065] 한수
문제 https://www.acmicpc.net/problem/1065 풀이 입력되는 N의 최대 크기가 1000이기 때문에, 한수에 대한 특징만 이해한다면 어렵지 않게 구현이 가능하다. 1~9 까지의 한 자리수는 모두 한수로 취급된다. (비교자리수가 없음) 10~99 까지의 두 자리수는 모두 한수로 취급된다. (비교가 1회로 끝남) 100 이상부터의 ...
[Python : 프로그래머스] 튜플
문제 https://programmers.co.kr/learn/courses/30/lessons/64065?language=python3 풀이 정규표현식으로 },{ 이랑 , 를 제거한다. 해시테이블로 각 숫자의 개수를 체크해낸다. 해시테이블의 내림차순으로 반환한다. import re def solution(s): news = re.sub('[{}]',...
[Python : 프로그래머스] 여행경로
문제 https://programmers.co.kr/learn/courses/30/lessons/43164?language=python3 풀이 재귀 DFS로 풀려하다가, 계속 머리속에서 꼬이는 바람에 그냥 스택으로 풀어냈다. 이게 속편한거 같다 ㅡㅡ;; 티켓을 ‘출발지:도착지1,도착지2,…’ 해시테이블로 변환한다. 여행경로가 2가지 이상 등장할 경우 ...
[Python : 백준 1931] 회의실배정
문제 https://www.acmicpc.net/problem/1931 한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중...
[Python : 백준 1541] 잃어버린 괄호
문제 https://www.acmicpc.net/problem/1541 풀이 괄호 개수 제한이 없기 때문에 ‘-‘를 발견하면, 이후 연산을 모두 뺄셈으로 바꿀 수 있다. 이를 코드로 옮길 때 ‘-‘를 발견하기 전 값은 더해주고 ‘-‘를 발견한 이후 값은 모두 빼주면 된다. line = input().split('-') total = 0 for i in...
[Python : 백준 11399] ATM
문제 https://www.acmicpc.net/problem/11399 풀이 지문에서 모든 힌트를 다 줬기 때문에, 그대로 코드에 옮기기만 하면 되는데 제한조건만 잘 확인하면 점화식까지 세울 필요도 없었다. 1초 제한에 N의 최대가 1,000이었기 때문에 그냥 O(n)시간 풀이로 해결해도 된다. N = int(input()) time = sorted...
[Python : 백준 11047] 동전 0
문제 https://www.acmicpc.net/problem/11047 준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다. 동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오. # 입력 예시 10 4200 1 5 10 50 100 500 1000 5...
[Python : 나동빈] 음료수 얼려 먹기
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) N * M 행렬을 입력 받는다. 행렬상의 0은 음료얼음, 1은 플라스틱 0이 이어지면 한 덩어리로 취급한다. 음료얼음 덩어리는 총 몇 개인가? # 입력 예시 4 5 00110 00011 11111 00000 # 출력 예시 3 풀이 DFS로 푸는게 적합해 보였다. 0과 1로 이루어진 ...
[Python : 나동빈] 왕실의 나이트
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 8 * 8 크기의 체스판 좌표를 입력 받으면, 나이트가 움직일 수 있는 경우의 수 구하기 # 체스판 예시 a b c d e f g h 1 - - - - - - - - 2 - - - - - - - - 3 - - - - - - - - 4 - - - - - - - - 5 - - - - -...
[Python : 나동빈] 시각
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중 3이 하나라도 포함되는 모든 경우의 수를 구하라. # 입력 예시 5 # 출력 예시 11475 풀이 1 시간은 3,600초다. 03시, 13시, 23시는 무조건 3,600개의 3을 마주친다. 그 외 시...
[Python : 나동빈] 상하좌우
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) N * N 행렬 좌표 가장 좌측 상단 좌표는 1,1 가장 우측 하단 좌표는 N,N 로 표기한다. N 길이의 입력에는 L(left), R(right), U(up), D(down) 이 들어있다. 좌표를 초과하는 이동은 무시한다. 예를 들어 1,1에서 L,U를 입력 받으면 이동하지 않는다...
[Python : 나동빈] 미로 탈출
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) N * M 행렬 미로 1은 길, 0은 벽 1,1 지점부터 N, M 지점까지 이동하는데 필요한 최저횟수를 구하라. # 입력 예시 5 6 101010 111111 000001 111111 111111 # 출력 예시 10 풀이 BFS에 익숙하지 않아 답안 코드를 많이 참고했다. BFS에는...
[Python : 나동빈] 문자열 재정렬
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 알파벳 대문자와 숫자(0~9)로만 이루어진 문자열이 주어진다. 이 문자열을 알파벳 오름차순으로 정렬하고, 숫자는 모두 더해서 뒤에 붙여라. # 입력 예시 K1KA5CB7 # 출력 예시 ABCKK13 풀이 파이썬 sorted 함수는 숫자와 문자가 섞여있는 리스트에서 숫자를 앞쪽으로, ...
[Python : 나동빈] 모험가 길드
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 한 마을에 모험가가 N명 모험가별로 가지고 있는 ‘공포도’가 다르다. 공포도가 X인 모험가는 반드시 X명 이상으로 구성한 모험가 그룹에 참여 최대 몇 그룹이 탄생하는가 # 입력 예시 5 2 3 1 2 2 # 출력 예시 2 풀이 문제 지문이 애매해서 예시를 보고서야 이해했던 문제 “최...
[Python : 나동빈] 곱하기 혹은 더하기
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 각 자리가 숫자(0부터 9)로만 이루어진 문자열 S가 주어졌을 때, 왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며 숫자 사이에 ‘*’ 혹은 ‘+’ 연산자를 넣어 결과적으로 만들어질 수 있는 가장 큰 수를 구하는 프로그램을 작성하세요. 단, +보다 X를 먼저 계산하는 일반적인 방식과...
[Python : 프로그래머스] 영어 끝말잇기
문제 https://programmers.co.kr/learn/courses/30/lessons/12981?language=python3 풀이 def solution(n, words): preword = {words[0]:1} for i in range(1, len(words)): if words[i-1][-1] != words[i][0] or wor...
[Python : 프로그래머스] 땅따먹기
문제 https://programmers.co.kr/learn/courses/30/lessons/12913 풀이 문제에 제시된 조건을 읽자마자 각 행을 내림차순으로 정렬해서 이전 행에서 가져온 최대값과 열이 같으면 바로 다음 값을 찾는 식으로 구현했다. def solution(land): answer, preidx = 0, -1 land = [sort...
[Python : 프로그래머스] 최댓값과 최솟값
문제 https://programmers.co.kr/learn/courses/30/lessons/12939?language=python3 풀이 문자열을 split 함수를 이용하면 공백문자 단위로 쪼갤 수 있고, map 함수로 쪼개진 리스트를 정수형으로 변환시키면, min/max 함수 사용이 가능해진다. 그걸 다시 str 함수로 묶어서 문자열 정답으로 ...
[Python : 프로그래머스] 올바른 괄호
문제 https://programmers.co.kr/learn/courses/30/lessons/12909?language=python3 풀이 ’(‘와 ‘)’ 의 갯수부터 맞지 않는다면 탐색할 필요 없이 바로 False를 반환한다. 제한사항과 입출력 예시에서 말하는 올바른 괄호는 우리가 흔히 아는 그 괄호 방식이다. 즉, 단 한 번이라도 ‘)’가 더 ...
[Python : 프로그래머스] 가장 큰 정사각형 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/12905?language=python3 풀이 우선 처음에 잘못 접근했던 코드부터 기록해볼까 한다. def solution(board): cube = [0] * len(board[0]) for row in board : cube = [c+r for c,r ...
[Python : 프로그래머스] 최솟값 만들기
문제 https://programmers.co.kr/learn/courses/30/lessons/12941?language=python3 풀이 곱셈의 특성을 생각하면 어떻게 접근해야할지 파악이 가능한 문제다. 최대값은 될 수 있는한 최소값으로 곱하고, 최소값을 최대값으로 곱해줘야 누적결과가 최소로 나온다. def solution(A,B): answer...
[Python : 프로그래머스] 다음 큰 숫자
문제 https://programmers.co.kr/learn/courses/30/lessons/12911?language=python3 풀이 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다. 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장...
[Python : 프로그래머스] 폰켓몬
문제 https://programmers.co.kr/learn/courses/30/lessons/1845 풀이 nums result [3,1,2,3] 2 [3,3,3,2,2,4] 3 [3,3,3,2,2,2] 2 우선 곧장 모든 조합을 구하는 것은 굉장히 무거우므로 배제한다. 안봐도 시간초과가 수두룩 하게 뜰 것이다. “nums를 바로 중복배제 시킨 다...
[Python : 프로그래머스] 정수 삼각형
문제 https://programmers.co.kr/learn/courses/30/lessons/43105?language=python3 풀이 대게 이런 삼각형 문제들은 행 단위로 구분시켰을 때 위 아래 행 간의 구성에 대해 이해하면 풀이가 시작되는 것 같다. [7] ---------- 0 [3, 8] -------- 1 [8, 1, 0] ------...
[Python : 프로그래머스] 오픈채팅방
문제 https://www.welcomekakao.com/learn/courses/30/lessons/42888?language=python3 풀이 #input ["Enter uid1234 Muzi", "Enter uid4567 Prodo", "Leave uid1234", "Enter uid1234 Prodo", "Change uid4567 Ryan"...
[Python : 프로그래머스] 스킬트리
문제 https://programmers.co.kr/learn/courses/30/lessons/49993?language=python3 풀이 def solution(skill, skill_trees): answer = 0 for tree in skill_trees : idx = 0 for t in tree : if t in skill : if ski...
[Python : 프로그래머스] 서울에서 김서방 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/12919 풀이 def solution(seoul): return "김서방은 "+str(seoul.index("Kim"))+"에 있다" 사실 LEVEL 1 문제를 마주할 때마다 “그냥 건너뛸까?” 라는 생각을 하지만 다른 사람의 풀이 중에 배울게 있지 않을...
[Python : 프로그래머스] 멀쩡한 사각형
문제 https://programmers.co.kr/learn/courses/30/lessons/62048?language=python3 풀이 처음에 문제를 읽고 예시그림이 너무 간결해서 눈을 의심했지만, 그렇게 간결한 예시그림을 준 이유는 무엇이겠는가? 수학적으로 접근해서 해결 하라는 것이겠지. 결국 수학적으로 접근해서 해결하면 쉽게 해결되는 문제였...
[Python : 프로그래머스] 멀리 뛰기
문제 https://programmers.co.kr/learn/courses/30/lessons/12914 풀이 멀리 뛰기 칸이 1개 일때부터 조합의 수를 나열해보자. 1 -- [1] -- 1 2 -- [1,1][2] -- 2 3 -- [1,1,1][1,2][2,1] -- 3 4 -- [1,1,1,1][1,1,2][1,2,1][2,1,1][2,2] -...
[Python : 프로그래머스] 구명보트
문제 https://programmers.co.kr/learn/courses/30/lessons/42885?language=python3 풀이 조이스틱에서 피본거에 비하면 20분만에 쉽게 풀어낸 문제. 피본 덕분에 실력이 늘은건가? from collections import deque def solution(people, limit): dp = de...
[Python : 프로그래머스] 124 나라의 숫자
문제 https://programmers.co.kr/learn/courses/30/lessons/12899 풀이 1, 2, 4 로 이루어진 3진수 숫자로 10진수를 변환시키는 문제. 단, 우리가 아는 8진수 16진수는 0~7, 0~15로 이루어져있는데, 124 나라의 3진수는 1, 2, 4 로 이루어져 있다. 이 때문에 4, 1, 2 로 변환하여 시도...
[Python : 프로그래머스] 큰 수 만들기
문제 https://programmers.co.kr/learn/courses/30/lessons/42883?language=python3 풀이 from itertools import combinations def solution(number, k): lst = list(combinations(range(len(number)), len(number)-k...
[Python : 프로그래머스] 조이스틱
문제 https://programmers.co.kr/learn/courses/30/lessons/42860 풀이 LEVEL 2인거 보고 덤볐다가 3시간 넘게 피본 문제 def solution(name): name = list(name) total = 0 i = 0 while True : # 상하 조작 total += min(ord(name[i])-65...
[Python : 프로그래머스] 더 맵게
문제 https://programmers.co.kr/learn/courses/30/lessons/42626?language=python3 풀이 최소/최대 값을 계속 사용하는 알고리즘이다? –> Heap 자료구조. 파이썬 내장모듈 heapq를 통해 구현했다. Heap 자료구조가 궁금하거나 직접 구현해야한다면 [자료구조] 힙(heap)이란 - Hee...
[Python : 프로그래머스] 단어 변환
문제 https://programmers.co.kr/learn/courses/30/lessons/43163?language=python3 풀이 최초 시도 def DFS(compw, words, count): for w in range(len(words)): if len([d for d in range(len(word)) if words[d] != co...
[Python : 프로그래머스] 크레인 인형뽑기 게임
문제 https://programmers.co.kr/learn/courses/30/lessons/64061 풀이 def solution(board, moves): answer = 0 stack = [] ht = {} for mov in moves : if not mov in ht : ht[mov] = [i[mov-1] for i in board if ...
[Python : 프로그래머스] 체육복
문제 https://programmers.co.kr/learn/courses/30/lessons/42862?language=python3 풀이 def solution(n, lost, reserve): ht = {} for i in range(1, n+1): ht[i] = 1 if i in lost : ht[i] -= 1 if i in reserve :...
[Python : 프로그래머스] 문자열 다루기 기본
문제 https://programmers.co.kr/learn/courses/30/lessons/12918?language=python3 풀이 def solution(s): return s.isdigit() and (len(s) == 4 or len(s) == 6) 더 나은 풀이 def solution(s): return s.isdigit() and ...
[Python : 프로그래머스] 문자열 내림차순으로 배치하기
문제 https://programmers.co.kr/learn/courses/30/lessons/12917?language=python3 풀이 def solution(s): return "".join(sorted(s, reverse=True)) 문제 조건 중에 “대문자는 더 작은 것으로 간주합니다.”가 있길레 ASCII를 기준으로 정렬되겠거니 하고 r...
[Python : 프로그래머스] 문자열 내 마음대로 정렬하기
문제 https://programmers.co.kr/learn/courses/30/lessons/12915?language=python3 풀이 def solution(strings, n): return sorted(sorted(strings), key=lambda x: x[n]) sorted 함수는 기본적으로 완전정렬이므로, 한 번 단어의 사전 순으로...
[Python : 프로그래머스] 문자열 내 p와 y의 개수
문제 https://programmers.co.kr/learn/courses/30/lessons/12916?language=python3 풀이 def solution(s): return s.lower().count('p') == s.lower().count('y') 점점 파이써닉이 손에 익는거 같다! 중고딩 땐 “갯수”가 표준어였는데, 새내기 때 “개...
[Python : 프로그래머스] 두 정수 사이의 합
문제 https://programmers.co.kr/learn/courses/30/lessons/12912?language=python3 풀이 def solution(a, b): return sum([i for i in range(min(a,b), max(a,b)+1)]) 더 나은 풀이 def adder(a, b): return sum(range(mi...
[Python : 프로그래머스] 두 개 뽑아서 더하기
문제 https://programmers.co.kr/learn/courses/30/lessons/68644?language=python3 풀이 def solution(numbers): from itertools import combinations return sorted(list(set(map(lambda x: x[0]+x[1],list(combina...
[Python : 프로그래머스] 나누어 떨어지는 숫자 배열
문제 https://programmers.co.kr/learn/courses/30/lessons/12910 풀이 def solution(arr, divisor): answer = sorted([i for i in arr if i%divisor == 0]) return answer if len(answer) > 0 else [-1] 아 참 잘풀었다...
[Python : 프로그래머스] 같은 숫자는 싫어
문제 https://programmers.co.kr/learn/courses/30/lessons/12906 풀이 def solution(arr): a = [] for i in arr : if len(a) < 1 or a[-1] != i : a.append(i) return a 더 나은 풀이 def no_continuous(s): a = [] fo...
[Python : 프로그래머스] 가운데 글자 가져오기
문제 https://programmers.co.kr/learn/courses/30/lessons/12903 풀이 def solution(s): if len(s) % 2 : return s[len(s)//2] else : return s[len(s)//2-1:len(s)//2+1] 최고는 아니겠지만 이정도면 그래도 짧은 편이지 않을까 했다. 더 나은 풀...
[Python : 프로그래머스] 2016년
문제 https://programmers.co.kr/learn/courses/30/lessons/12901 풀이 def solution(a, b): week = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"] month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] ...
[Python : 프로그래머스] 타겟 넘버
문제 https://programmers.co.kr/learn/courses/30/lessons/43165 풀이 def solution(numbers, target): from itertools import product pm = [(num, -num) for num in numbers] answer = list(map(sum, product(*pm)...
[Python : 프로그래머스] 카펫
문제 https://programmers.co.kr/learn/courses/30/lessons/42842?language=python3 풀이 def solution(brown, yellow): total = brown + yellow cd = [i for i in range(2,total) if total % i == 0] if len(cd) % 2...
[Python : 프로그래머스] 네트워크
문제 https://programmers.co.kr/learn/courses/30/lessons/43162 풀이 DFS로 경로가 몇 개인지 찾는 문제 보통 DFS가 무한루프에 빠지지 않도록 방문내역을 확인하는데, 모든 노드에 대해서 방문기록이 있는지 확인하고, 없으면 DFS 진행시키면서 경로개수를 증가시켜서 해결한다. def DFS(i, visited...
[Python : 프로그래머스] 프린터
문제 https://programmers.co.kr/learn/courses/30/lessons/42587?language=python3 풀이 def solution(priorities, location): op = priorities[location] lst = sorted(list(enumerate(priorities)), key=lambda x:...
[Python : 프로그래머스] 소수 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/42839 풀이 from itertools import permutations def isPrime(n: int) -> bool: if n < 2 : return False for i in range(2, n) : if n%i == 0 : ret...
[Python : 프로그래머스] 모의고사
문제 https://programmers.co.kr/learn/courses/30/lessons/42840?language=python3 풀이 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 지문이 웃겼던 문제 def solution(...
[Python : 프로그래머스] 다리를 지나는 트럭
문제 https://programmers.co.kr/learn/courses/30/lessons/42583 풀이 문제를 처음 읽었을 당시 실제로 큐에 값이 차례로 Insert / POP 되는 형태보다 weight를 넘지 않는 인접값끼리 한 꺼번에 처리하면 좋지 않을까 하며 그림을 그려봤다. truck_weights : [7, 4, 5, 1, 6] br...
[Python : 프로그래머스] 주식가격
문제 https://programmers.co.kr/learn/courses/30/lessons/42584 풀이 def solution(prices): answer = [0] prices.reverse() print(prices) for i in range(1, len(prices)) : if prices[i] > prices[i-1] : ans...
[Python : 프로그래머스] 베스트앨범
문제 https://programmers.co.kr/learn/courses/30/lessons/42579 풀이 ‘이건 알고리즘보다 자료구조에 치중된 문제가 아닌가?’ 생각하면서 다 풀고 보니까 3레벨 문제였네. ‘설마 이중해시일까?, 아니겠지’ 하면서 계속 고민 해봤지만 결국 이중해시로 해결한 문제였다. 알고리즘 자체는 어려울게 없었으나 파이썬 이중...
[Python : 프로그래머스] 기능개발
문제 https://programmers.co.kr/learn/courses/30/lessons/42586 풀이 def solution(progresses, speeds): import math answer = [] Q = [] for p, s in zip(progresses, speeds) : day = math.ceil((100-p)/s) if n...
[Python : 프로그래머스] H-Index
문제 https://programmers.co.kr/learn/courses/30/lessons/42747 풀이 def solution(citations): citations = sorted(citations) answer = 0 for i in range(len(citations)) : if i+1 >= citations[i] : answer ...
[Python : 프로그래머스] 가장 큰 수
문제 https://programmers.co.kr/learn/courses/30/lessons/42746 풀이 가장 단순하게 떠올린 방법은 itertools 라이브러리의 permutations 함수를 이용해서 모든 조합을 구한다음 비교하는 것이었는데, 대부분의 탐색 알고리즘은 O(nlogn)을 넘어가지 않게 구현해야 한다. 이 때문에 이 방식은 완전...
[Python 재무제표 크롤링 #5] txt to tsv 자동화
OpenDART에서 제공해준 API들을 추가적으로 조사해보다가, 굳이 기업별로 재무정보를 확인할 필요 없이 상장되어 있는 전체 기업들의 재무정보를 한꺼번에 확인할 수 있는 txt파일의 다운로드를 제공한다는 것을 확인했다. 얼마전 차장님께서 진행해주신 ERP 관련 교육 때, ERP 내부 데이터베이스에 기업들의 재무정보를 기입해두면 재무팀쪽에서 매번 번거...
[Python 재무제표 크롤링 #4] 뒤집힌 프로젝트
2020년 1월 22일 기준 전자공시사이트(dart.fss.or.kr)에서 신규API사이트 오픈을 공개했다. 그간 개발해온 프로젝트와 동일한 목적을 이루는 API 또한 존재하는 걸 확인했고, 이를 테스트 해본 결과 더 양질의 결과물을 얻을 수 있는 것을 확인했다. 그렇다. 위의 말을 정리하자면 그간 진행해온 사항들이 물거품이 된 것이다! 이 때문에 갈...
[Python 미니 프로젝트] 도메인을 이용한 IP탐색 자동화
도메인에 매핑되어 있는 IP들을 cmd 명령어 nslookup을 통해 하나하나 확인 후 기록해달라는 요청을 받았다. 처음 엑셀 파일을 열어보고 당황했지만, 갯수나 세어보고 얼마 안되면 해치워버리자는 마음으로 갯수를 세보았다. 그랬더니 100개가 넘어가네.. 물론 시간을 들인다면 해낼 수 있겠지만, 4가지 특이점이 왔었다. 도저히 그럴 엄두가 안난다. ...
[Python 재무제표 크롤링 #3] 분기점 세분화 및 예외처리 시작
저번 포스팅까지 작성된 코드에서는 연결 재무상태표에 대한 정보만을 다루었다. 이번에는 (개별) 재무상태표의 정보까지 다루기 위해 연결 재무제표와 (개별) 재무제표를 구별할 수 있는 분기점을 설계 및 보완하고, 기업별로 들쭉날쭉한 사업보고서 양식을 커버할 수 있는 방법에 대해 고안해보았다. 기업별로 서로 다른 사업보고서 양식에 대해서는 사실상 모든 경우...
[Python 재무제표 크롤링 #2] 설계 및 구현 고도화
이번 글에서는 [Python 재무제표 크롤링 #1] 요구사항, 재무제표 분석 및 설계에서 작성했던 코드를 다듬고, 실행 결과 파일 저장명을 기업명(또는 기업종목코드)와 해당 보고서명의 조합으로 저장하기 위한 코드를 추가했다. 또한 재무상태표의 표만을 엑셀에 저장하는 것이 아닌, 재무상태표의 속성정보(기재 날짜, 단위 등)를 표현할 수 있는 방법에 대해...
[Python 재무제표 크롤링 #1] 요구사항, 재무제표 분석 및 설계
방학기간 동안 인턴활동을 하면서 DART 전자공시시스템에서 제공하는 연결재무상태표와 (개별)재무상태표를 크롤링하는 프로젝트를 진행하게 되었다. 프로젝트를 공식적으로 시작한 날짜는 1월 3일이었으나, 중간에 다른 업무들이 겹쳐서 실질적으로 시작한 날짜는 1월 10일 정도였다. 코드가 추가 및 수정된 부분이 꽤 되었으나, 그걸 기록해두지 않았어서 (-_-...
프로그래머스
[Java : 프로그래머스] N개의 최소공배수
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/12953?language=java 🎯 풀이 배열의 숫자 중 가장 큰 숫자를 기준 값으로 선정한다. 기준 값을 배열의 숫자들로 나눈다. 나머지가 0이 아닌 숫자가 하나라도 있을 경우, 기준 값을 +1 시키고 반복. 모든 숫자로 나눈 나머지가 0일 경우,...
[Python : 프로그래머스] 실패율
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42889 🎯 풀이 2019 KAKAO BLIND RECRUITMENT에 출제되었던 문제. 해시테이블을 이용해서 풀어냈다. def solution(N, stages): stageTable, failedTable = {}, {} stages.sort() ...
[Python : 프로그래머스] 섬 연결하기
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42861 🎯 풀이 Kruskal 알고리즘으로 풀어내면 쉬운 문제. Kruskal 알고리즘은 Union-find + Sorting 이 더해진 알고리즘이다. Union-find 없이 최저비용 연결만 진행하면 Cycle이 발생할 수 있다. 이 때문에 Uni...
[Java : 프로그래머스] 카펫
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42842?language=java 🎯 풀이 전체 카펫(사각형)의 넓이를 생각하고 접근해야 brown 개수에도 알맞는 정답이 나온다. 문제에서 구해야하는 가로, 세로 길이의 합은 (brown+4)/2 로 구할 수 있다. 더해지는 4는 모서리 4개다. c...
[Java : 프로그래머스] 소수 찾기
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42839?language=java 🎯 풀이 소수 판별은 똑똑한 수학자들이 만들어놓은 만능 풀이법이 있기 때문에 구현이 간단하다. 1은 소수가 아니다. 2는 유일한 짝수 소수다. 모든 짝수는 소수가 아니다. 그 외의 홀수는 3,5,7,9, … , 제곱근...
[Java : 프로그래머스] 네트워크
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/43162 🎯 풀이 ❌ 상하좌우 풀이 class Solution { public int solution(int n, int[][] computers) { int answer = 0; for(int x = 0; x < computers.length;...
[Java : 프로그래머스] 모의고사
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42840?language=java 🎯 풀이 단순 구현 문제. import java.util.*; class Solution { public int[] solution(int[] answers) { // 패턴 3개 초기화. int[] pattern1 =...
[Java : 프로그래머스] 프린터 🖨️
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42587?language=java 🎯 풀이 priority와 index를 한꺼번에 관리하기 위해 구조체(Class)생성. 구조체화 시킨 데이터를 Queue에 삽입. Queue 루프를 돌면서 Priority 비교 Priority가 제일 크다면, Queu...
[Java : 프로그래머스] 전화번호 목록
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42577?language=java 🎯 풀이 문제 분류는 Hash로 분류되어 있지만, 자바는 Hash없이 처리가 가능하다. 자바의 String 클래스는 접두사와 접미사 관련 메소드를 지원한다. startWith과 endWith이 그 주인공이다. 좋은 메...
[Java : 프로그래머스] 위장
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42578?language=java 🎯 풀이 점화식을 찾아내면 Hash는 그저 배열 분류용도로만 사용된다. ((모자개수 + 1) * (하의개수 + 1) * (겉온개수 + 1) * …) - 1 Hash의 value로 들어간 list나 array의 길이값+...
[Java : 프로그래머스] 완주하지 못한 선수
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42576?language=java 🎯 풀이 ❌ ArrayList를 이용한 풀이 ArrayList에 참가자 명단을 삽입한다. ArrayList에서 완주자들을 제거한다. import java.util.*; class Solution { public Str...
[Java : 프로그래머스] 다리를 지나는 트럭
문제 https://programmers.co.kr/learn/courses/30/lessons/42583?language=java 풀이 Queue로 사용할 데이터들의 전처리를 진행한다. 출발하는 트럭 배열을 Trucks Queue로 재선언한다. Bridge의 길이만큼 무게 0으로 채워둔 Bridge Queue를 선언한다. 알고리즘 시작. Bridge...
[Java : 프로그래머스] H-Index
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42747?language=java 🎯 풀이 원리는 “인용된 횟수가 N을 넘어가는 N개의 논문”을 찾는 것이다. 즉, 인용 횟수가 많은 논문부터 개수를 1개씩 카운트하면서, 인용 횟수와 논문개수 카운트가 교차하는 지점이 정답이 된다. 이를 코드로 구현하...
[Java : 프로그래머스] 체육복
문제 https://programmers.co.kr/learn/courses/30/lessons/42862 풀이 자바가 갖고 있는 자료구조나 클래스들에 익숙해지기 위해 도전했다가 int와 Integer의 차이, ArrayList 등 많이 배운 문제. 우선 틀린 풀이부터… 1차 풀이 key값을 이용한 요소제거를 위해서 Hashtable 자료구조로 접근했...
[Java : 프로그래머스] 주식가격
문제 https://programmers.co.kr/learn/courses/30/lessons/42584?language=java 풀이 시간을 기록할 빈 배열을 선언한다. 탐색(루프) 진행. 뒤에 남은 원소만큼 증가연산을 진행한다. 뒤에 남은 원소 중 더 작은 원소를 발견하면 루프를 탈출한다! class Solution { public int[] s...
[Java : 프로그래머스] 기능개발
문제 https://programmers.co.kr/learn/courses/30/lessons/42586?language=java 풀이 가장 앞에 들어있는 요소를 이용해야하므로, 큐를 이용해 접근해야한다. ((100 - 진행량) / 작업속도)의 올림 값(남은일)을 구한다. 큐가 비어있지 않고, 큐의 가장 앞의 값보다 방금 구한 값이 더 클 경우! 큐...
[Java : 프로그래머스] 가장 큰 수
내 블로그에 처음으로 댓글이 달렸던 그 문제! 이번엔 자바로 풀어보자. 문제 https://programmers.co.kr/learn/courses/30/lessons/42746 풀이 1차 풀이 Hastable을 이용한 접근을 시도했다. Key에는 4자리수 이상으로 키워낸 문자열 대입. Value에는 원본 정수모양 문자열 대입. Key 기준 내림차순 ...
[Java : 프로그래머스] K번째수
문제 https://programmers.co.kr/learn/courses/30/lessons/42748?language=java 풀이 문제 지문 그대로 구현하면 된다. import java.util.*; class Solution { public int[] solution(int[] array, int[][] commands) { // 정답 배열 ...
[Java : 프로그래머스] 2016년
NHN 코딩테스트를 앞두고 있는데, C, C++, Java 3개 언어로만 응시가 가능하다. 임베디드 과목 수강하면서 꾸준히 사용했던 C로 응시할까 했는데, Java에 익숙해 질 겸 Java 응시를 결정했다. 문제 https://programmers.co.kr/learn/courses/30/lessons/12901?language=java# 풀이 cla...
[Python : 프로그래머스] 튜플
문제 https://programmers.co.kr/learn/courses/30/lessons/64065?language=python3 풀이 정규표현식으로 },{ 이랑 , 를 제거한다. 해시테이블로 각 숫자의 개수를 체크해낸다. 해시테이블의 내림차순으로 반환한다. import re def solution(s): news = re.sub('[{}]',...
[Python : 프로그래머스] 여행경로
문제 https://programmers.co.kr/learn/courses/30/lessons/43164?language=python3 풀이 재귀 DFS로 풀려하다가, 계속 머리속에서 꼬이는 바람에 그냥 스택으로 풀어냈다. 이게 속편한거 같다 ㅡㅡ;; 티켓을 ‘출발지:도착지1,도착지2,…’ 해시테이블로 변환한다. 여행경로가 2가지 이상 등장할 경우 ...
[SQL : 프로그래머스] 중성화 여부 파악하기
문제 https://programmers.co.kr/learn/courses/30/lessons/59409 풀이 SELECT ANIMAL_ID, NAME, IF(SEX_UPON_INTAKE LIKE 'Intact%', 'X', 'O') AS 중성화 FROM ANIMAL_INS ORDER BY ANIMAL_ID IF 절을 사용할 줄 안다면 쉽게 풀 수 ...
[SQL : 프로그래머스] 있었는데요 없었습니다
문제 https://programmers.co.kr/learn/courses/30/lessons/59043?language=mysql 풀이 SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME FROM ANIMAL_INS JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID=ANIMAL_OUTS.ANIMA...
[SQL : 프로그래머스] 입양 시각 구하기(2)
문제 https://programmers.co.kr/learn/courses/30/lessons/59413?language=mysql 풀이 갑자기 안풀려서 답답했던 문제였는데, 알고보니 LEVEL 4 였다더라~ SET을 통해 변수를 설정해야 쉽게 풀 수 있는 문제였다. SET @hour := -1; SELECT (@hour := @hour+1) as ...
[SQL : 프로그래머스] 오랜 기간 보호한 동물(2)
문제 https://programmers.co.kr/learn/courses/30/lessons/59411 풀이 SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME FROM ANIMAL_INS INNER JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID=ANIMAL_OUTS.ANIMAL_ID ORDE...
[SQL : 프로그래머스] 오랜 기간 보호한 동물(1)
문제 https://programmers.co.kr/learn/courses/30/lessons/59044 풀이 SELECT ANIMAL_INS.NAME, ANIMAL_INS.DATETIME FROM ANIMAL_INS LEFT JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID=ANIMAL_OUTS.ANIMAL_ID WHERE ...
[SQL : 프로그래머스] 보호소에서 중성화한 동물
문제 https://programmers.co.kr/learn/courses/30/lessons/59045 풀이 중요한 것을 잃은 문제! SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.ANIMAL_TYPE, ANIMAL_INS.NAME FROM ANIMAL_INS INNER JOIN ANIMAL_OUTS ON ANIMAL_IN...
[SQL : 프로그래머스] DATETIME에서 DATE로 형 변환
문제 https://programmers.co.kr/learn/courses/30/lessons/59414 풀이 SELECT ANIMAL_ID, NAME, date_format(DATETIME, '%Y-%m-%d') AS '날짜' FROM ANIMAL_INS ORDER BY ANIMAL_ID 쉬운 문제의 경우 되도록 포스팅을 자제하려고 하는데 date...
[Python : 프로그래머스] 영어 끝말잇기
문제 https://programmers.co.kr/learn/courses/30/lessons/12981?language=python3 풀이 def solution(n, words): preword = {words[0]:1} for i in range(1, len(words)): if words[i-1][-1] != words[i][0] or wor...
[Python : 프로그래머스] 땅따먹기
문제 https://programmers.co.kr/learn/courses/30/lessons/12913 풀이 문제에 제시된 조건을 읽자마자 각 행을 내림차순으로 정렬해서 이전 행에서 가져온 최대값과 열이 같으면 바로 다음 값을 찾는 식으로 구현했다. def solution(land): answer, preidx = 0, -1 land = [sort...
[SQL : 프로그래머스] 중복 제거하기
문제 https://programmers.co.kr/learn/courses/30/lessons/59408 풀이 SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME!='' 중복제거가 DISTINCT인건 인지하고 있었는데, COUNT함수로 묶을 수 있다는 건 테스트하면서 깨달았다. NULL은 역시 그대로 쓰...
[SQL : 프로그래머스] 입양 시각 구하기(1)
문제 https://programmers.co.kr/learn/courses/30/lessons/59412?language=mysql 풀이 SELECT HOUR(DATETIME), COUNT(HOUR(DATETIME)) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19 ...
[SQL : 프로그래머스] 없어진 기록 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/59042 풀이 SELECT ANIMAL_ID, NAME FROM ANIMAL_OUTS WHERE ANIMAL_ID NOT IN ( SELECT ANIMAL_ID FROM ANIMAL_INS) JOIN 으로 풀기가 권장되는 문제지만, IN 을 알고 있다면 ...
[SQL : 프로그래머스] 상위 n개 레코드
문제 https://programmers.co.kr/learn/courses/30/lessons/59405 풀이 SELECT NAME FROM ANIMAL_INS WHERE DATETIME=(SELECT MIN(DATETIME) FROM ANIMAL_INS) SELECT 구절이 두 번 사용된다는 것은 아쉽지만, MIN 함수를 이용해서 최소값을 잡아내는...
[SQL : 프로그래머스] 동명 동물 수 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/59041 풀이 SELECT NAME, COUNT(NAME) FROM ANIMAL_INS GROUP BY NAME HAVING COUNT(NAME) > 1 ORDER BY NAME WHERE 는 집계함수를 사용 할 수 없다. HAVING 은 집계함수를...
[SQL : 프로그래머스] 고양이와 개는 몇 마리 있을까
문제 https://programmers.co.kr/learn/courses/30/lessons/59040 풀이 SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) FROM ANIMAL_INS GROUP BY ANIMAL_TYPE ORDER BY ANIMAL_TYPE 갑작스럽게 GROUP BY가 떠오르지 않아 질문 게시판을 참고했다....
[SQL : 프로그래머스] NULL 처리하기
문제 https://programmers.co.kr/learn/courses/30/lessons/59410 풀이 SELECT ANIMAL_TYPE, IF(NAME IS NULL, 'No name', NAME) AS NAME, SEX_UPON_INTAKE FROM ANIMAL_INS IF문을 이용해서 NAME IS NULL이 참이라면 No name, 아...
[Python : 프로그래머스] 최댓값과 최솟값
문제 https://programmers.co.kr/learn/courses/30/lessons/12939?language=python3 풀이 문자열을 split 함수를 이용하면 공백문자 단위로 쪼갤 수 있고, map 함수로 쪼개진 리스트를 정수형으로 변환시키면, min/max 함수 사용이 가능해진다. 그걸 다시 str 함수로 묶어서 문자열 정답으로 ...
[Python : 프로그래머스] 올바른 괄호
문제 https://programmers.co.kr/learn/courses/30/lessons/12909?language=python3 풀이 ’(‘와 ‘)’ 의 갯수부터 맞지 않는다면 탐색할 필요 없이 바로 False를 반환한다. 제한사항과 입출력 예시에서 말하는 올바른 괄호는 우리가 흔히 아는 그 괄호 방식이다. 즉, 단 한 번이라도 ‘)’가 더 ...
[Python : 프로그래머스] 가장 큰 정사각형 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/12905?language=python3 풀이 우선 처음에 잘못 접근했던 코드부터 기록해볼까 한다. def solution(board): cube = [0] * len(board[0]) for row in board : cube = [c+r for c,r ...
[Python : 프로그래머스] 최솟값 만들기
문제 https://programmers.co.kr/learn/courses/30/lessons/12941?language=python3 풀이 곱셈의 특성을 생각하면 어떻게 접근해야할지 파악이 가능한 문제다. 최대값은 될 수 있는한 최소값으로 곱하고, 최소값을 최대값으로 곱해줘야 누적결과가 최소로 나온다. def solution(A,B): answer...
[Python : 프로그래머스] 다음 큰 숫자
문제 https://programmers.co.kr/learn/courses/30/lessons/12911?language=python3 풀이 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다. 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장...
[Python : 프로그래머스] 폰켓몬
문제 https://programmers.co.kr/learn/courses/30/lessons/1845 풀이 nums result [3,1,2,3] 2 [3,3,3,2,2,4] 3 [3,3,3,2,2,2] 2 우선 곧장 모든 조합을 구하는 것은 굉장히 무거우므로 배제한다. 안봐도 시간초과가 수두룩 하게 뜰 것이다. “nums를 바로 중복배제 시킨 다...
[Python : 프로그래머스] 정수 삼각형
문제 https://programmers.co.kr/learn/courses/30/lessons/43105?language=python3 풀이 대게 이런 삼각형 문제들은 행 단위로 구분시켰을 때 위 아래 행 간의 구성에 대해 이해하면 풀이가 시작되는 것 같다. [7] ---------- 0 [3, 8] -------- 1 [8, 1, 0] ------...
[Python : 프로그래머스] 오픈채팅방
문제 https://www.welcomekakao.com/learn/courses/30/lessons/42888?language=python3 풀이 #input ["Enter uid1234 Muzi", "Enter uid4567 Prodo", "Leave uid1234", "Enter uid1234 Prodo", "Change uid4567 Ryan"...
[Python : 프로그래머스] 스킬트리
문제 https://programmers.co.kr/learn/courses/30/lessons/49993?language=python3 풀이 def solution(skill, skill_trees): answer = 0 for tree in skill_trees : idx = 0 for t in tree : if t in skill : if ski...
[Python : 프로그래머스] 서울에서 김서방 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/12919 풀이 def solution(seoul): return "김서방은 "+str(seoul.index("Kim"))+"에 있다" 사실 LEVEL 1 문제를 마주할 때마다 “그냥 건너뛸까?” 라는 생각을 하지만 다른 사람의 풀이 중에 배울게 있지 않을...
[Python : 프로그래머스] 멀쩡한 사각형
문제 https://programmers.co.kr/learn/courses/30/lessons/62048?language=python3 풀이 처음에 문제를 읽고 예시그림이 너무 간결해서 눈을 의심했지만, 그렇게 간결한 예시그림을 준 이유는 무엇이겠는가? 수학적으로 접근해서 해결 하라는 것이겠지. 결국 수학적으로 접근해서 해결하면 쉽게 해결되는 문제였...
[Python : 프로그래머스] 멀리 뛰기
문제 https://programmers.co.kr/learn/courses/30/lessons/12914 풀이 멀리 뛰기 칸이 1개 일때부터 조합의 수를 나열해보자. 1 -- [1] -- 1 2 -- [1,1][2] -- 2 3 -- [1,1,1][1,2][2,1] -- 3 4 -- [1,1,1,1][1,1,2][1,2,1][2,1,1][2,2] -...
[Python : 프로그래머스] 구명보트
문제 https://programmers.co.kr/learn/courses/30/lessons/42885?language=python3 풀이 조이스틱에서 피본거에 비하면 20분만에 쉽게 풀어낸 문제. 피본 덕분에 실력이 늘은건가? from collections import deque def solution(people, limit): dp = de...
[Python : 프로그래머스] 124 나라의 숫자
문제 https://programmers.co.kr/learn/courses/30/lessons/12899 풀이 1, 2, 4 로 이루어진 3진수 숫자로 10진수를 변환시키는 문제. 단, 우리가 아는 8진수 16진수는 0~7, 0~15로 이루어져있는데, 124 나라의 3진수는 1, 2, 4 로 이루어져 있다. 이 때문에 4, 1, 2 로 변환하여 시도...
[Python : 프로그래머스] 큰 수 만들기
문제 https://programmers.co.kr/learn/courses/30/lessons/42883?language=python3 풀이 from itertools import combinations def solution(number, k): lst = list(combinations(range(len(number)), len(number)-k...
[Python : 프로그래머스] 조이스틱
문제 https://programmers.co.kr/learn/courses/30/lessons/42860 풀이 LEVEL 2인거 보고 덤볐다가 3시간 넘게 피본 문제 def solution(name): name = list(name) total = 0 i = 0 while True : # 상하 조작 total += min(ord(name[i])-65...
[Python : 프로그래머스] 더 맵게
문제 https://programmers.co.kr/learn/courses/30/lessons/42626?language=python3 풀이 최소/최대 값을 계속 사용하는 알고리즘이다? –> Heap 자료구조. 파이썬 내장모듈 heapq를 통해 구현했다. Heap 자료구조가 궁금하거나 직접 구현해야한다면 [자료구조] 힙(heap)이란 - Hee...
[Python : 프로그래머스] 단어 변환
문제 https://programmers.co.kr/learn/courses/30/lessons/43163?language=python3 풀이 최초 시도 def DFS(compw, words, count): for w in range(len(words)): if len([d for d in range(len(word)) if words[d] != co...
[Python : 프로그래머스] 크레인 인형뽑기 게임
문제 https://programmers.co.kr/learn/courses/30/lessons/64061 풀이 def solution(board, moves): answer = 0 stack = [] ht = {} for mov in moves : if not mov in ht : ht[mov] = [i[mov-1] for i in board if ...
[Python : 프로그래머스] 체육복
문제 https://programmers.co.kr/learn/courses/30/lessons/42862?language=python3 풀이 def solution(n, lost, reserve): ht = {} for i in range(1, n+1): ht[i] = 1 if i in lost : ht[i] -= 1 if i in reserve :...
[Python : 프로그래머스] 문자열 다루기 기본
문제 https://programmers.co.kr/learn/courses/30/lessons/12918?language=python3 풀이 def solution(s): return s.isdigit() and (len(s) == 4 or len(s) == 6) 더 나은 풀이 def solution(s): return s.isdigit() and ...
[Python : 프로그래머스] 문자열 내림차순으로 배치하기
문제 https://programmers.co.kr/learn/courses/30/lessons/12917?language=python3 풀이 def solution(s): return "".join(sorted(s, reverse=True)) 문제 조건 중에 “대문자는 더 작은 것으로 간주합니다.”가 있길레 ASCII를 기준으로 정렬되겠거니 하고 r...
[Python : 프로그래머스] 문자열 내 마음대로 정렬하기
문제 https://programmers.co.kr/learn/courses/30/lessons/12915?language=python3 풀이 def solution(strings, n): return sorted(sorted(strings), key=lambda x: x[n]) sorted 함수는 기본적으로 완전정렬이므로, 한 번 단어의 사전 순으로...
[Python : 프로그래머스] 문자열 내 p와 y의 개수
문제 https://programmers.co.kr/learn/courses/30/lessons/12916?language=python3 풀이 def solution(s): return s.lower().count('p') == s.lower().count('y') 점점 파이써닉이 손에 익는거 같다! 중고딩 땐 “갯수”가 표준어였는데, 새내기 때 “개...
[Python : 프로그래머스] 두 정수 사이의 합
문제 https://programmers.co.kr/learn/courses/30/lessons/12912?language=python3 풀이 def solution(a, b): return sum([i for i in range(min(a,b), max(a,b)+1)]) 더 나은 풀이 def adder(a, b): return sum(range(mi...
[Python : 프로그래머스] 두 개 뽑아서 더하기
문제 https://programmers.co.kr/learn/courses/30/lessons/68644?language=python3 풀이 def solution(numbers): from itertools import combinations return sorted(list(set(map(lambda x: x[0]+x[1],list(combina...
[Python : 프로그래머스] 나누어 떨어지는 숫자 배열
문제 https://programmers.co.kr/learn/courses/30/lessons/12910 풀이 def solution(arr, divisor): answer = sorted([i for i in arr if i%divisor == 0]) return answer if len(answer) > 0 else [-1] 아 참 잘풀었다...
[Python : 프로그래머스] 같은 숫자는 싫어
문제 https://programmers.co.kr/learn/courses/30/lessons/12906 풀이 def solution(arr): a = [] for i in arr : if len(a) < 1 or a[-1] != i : a.append(i) return a 더 나은 풀이 def no_continuous(s): a = [] fo...
[Python : 프로그래머스] 가운데 글자 가져오기
문제 https://programmers.co.kr/learn/courses/30/lessons/12903 풀이 def solution(s): if len(s) % 2 : return s[len(s)//2] else : return s[len(s)//2-1:len(s)//2+1] 최고는 아니겠지만 이정도면 그래도 짧은 편이지 않을까 했다. 더 나은 풀...
[Python : 프로그래머스] 2016년
문제 https://programmers.co.kr/learn/courses/30/lessons/12901 풀이 def solution(a, b): week = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"] month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] ...
[Python : 프로그래머스] 타겟 넘버
문제 https://programmers.co.kr/learn/courses/30/lessons/43165 풀이 def solution(numbers, target): from itertools import product pm = [(num, -num) for num in numbers] answer = list(map(sum, product(*pm)...
[Python : 프로그래머스] 카펫
문제 https://programmers.co.kr/learn/courses/30/lessons/42842?language=python3 풀이 def solution(brown, yellow): total = brown + yellow cd = [i for i in range(2,total) if total % i == 0] if len(cd) % 2...
[Python : 프로그래머스] 네트워크
문제 https://programmers.co.kr/learn/courses/30/lessons/43162 풀이 DFS로 경로가 몇 개인지 찾는 문제 보통 DFS가 무한루프에 빠지지 않도록 방문내역을 확인하는데, 모든 노드에 대해서 방문기록이 있는지 확인하고, 없으면 DFS 진행시키면서 경로개수를 증가시켜서 해결한다. def DFS(i, visited...
[Python : 프로그래머스] 프린터
문제 https://programmers.co.kr/learn/courses/30/lessons/42587?language=python3 풀이 def solution(priorities, location): op = priorities[location] lst = sorted(list(enumerate(priorities)), key=lambda x:...
[Python : 프로그래머스] 소수 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/42839 풀이 from itertools import permutations def isPrime(n: int) -> bool: if n < 2 : return False for i in range(2, n) : if n%i == 0 : ret...
[Python : 프로그래머스] 모의고사
문제 https://programmers.co.kr/learn/courses/30/lessons/42840?language=python3 풀이 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 지문이 웃겼던 문제 def solution(...
[Python : 프로그래머스] 다리를 지나는 트럭
문제 https://programmers.co.kr/learn/courses/30/lessons/42583 풀이 문제를 처음 읽었을 당시 실제로 큐에 값이 차례로 Insert / POP 되는 형태보다 weight를 넘지 않는 인접값끼리 한 꺼번에 처리하면 좋지 않을까 하며 그림을 그려봤다. truck_weights : [7, 4, 5, 1, 6] br...
[Python : 프로그래머스] 주식가격
문제 https://programmers.co.kr/learn/courses/30/lessons/42584 풀이 def solution(prices): answer = [0] prices.reverse() print(prices) for i in range(1, len(prices)) : if prices[i] > prices[i-1] : ans...
[Python : 프로그래머스] 베스트앨범
문제 https://programmers.co.kr/learn/courses/30/lessons/42579 풀이 ‘이건 알고리즘보다 자료구조에 치중된 문제가 아닌가?’ 생각하면서 다 풀고 보니까 3레벨 문제였네. ‘설마 이중해시일까?, 아니겠지’ 하면서 계속 고민 해봤지만 결국 이중해시로 해결한 문제였다. 알고리즘 자체는 어려울게 없었으나 파이썬 이중...
[Python : 프로그래머스] 기능개발
문제 https://programmers.co.kr/learn/courses/30/lessons/42586 풀이 def solution(progresses, speeds): import math answer = [] Q = [] for p, s in zip(progresses, speeds) : day = math.ceil((100-p)/s) if n...
[Python : 프로그래머스] H-Index
문제 https://programmers.co.kr/learn/courses/30/lessons/42747 풀이 def solution(citations): citations = sorted(citations) answer = 0 for i in range(len(citations)) : if i+1 >= citations[i] : answer ...
[Python : 프로그래머스] 가장 큰 수
문제 https://programmers.co.kr/learn/courses/30/lessons/42746 풀이 가장 단순하게 떠올린 방법은 itertools 라이브러리의 permutations 함수를 이용해서 모든 조합을 구한다음 비교하는 것이었는데, 대부분의 탐색 알고리즘은 O(nlogn)을 넘어가지 않게 구현해야 한다. 이 때문에 이 방식은 완전...
Java
SimpleJdbcInsert를 통한 쉬운 Insert
private final JdbcTemplate jdbcTemplate; public StationDao(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void insert(final Station station) { String sql = "INSERT INTO sta...
패키지 구조는 어떻게 가져가는게 가장 좋을까?
📦 레이어 우선 io.github.hyeon9mak.domain.modulename io.github.hyeon9mak.dao.modulename io.github.hyeon9mak.service.modulename io.github.hyeon9mak.web.modulename 장점 도메인 모델 위주 개발에 적합하다. 각 패키지간의 순환 참조가 발생할...
추상 클래스를 왜 쓰나요?
👓 추상 클래스를 왜? 블랙잭 미션 피드백 강의의 핵심은 “객체지향의 다형성을 이용한 조건문 줄이기” 였다. 게임 내 규칙을 자바 객체로 추상화한다. 힛(Hit): 처음 2장의 상태에서 카드를 더 뽑는 것 스테이(Stay): 카드를 더 뽑지 않고 차례를 마치는 것 블랙잭(Blackjack): 처음 두 장의 카드 합이 21인 경우, 베팅 금액의 1.5배...
TDD와 단위 테스트는 서로 다르다
🧪 많이들 하는 착각 많이들 착각하는데, “단위 테스트를 만든다” 와 “TDD를 한다” 를 다르게 생각해야한다. 포비의 말을 듣고 뜨끔했다. 고작 단위 테스트를 몇 개 만들고 실행시킨 것으로 나 자신이 TDD를 지키고 있다고 착각한건 아니었나 되돌아보게 된다. 단위 테스트는 말 그대로 작은 단위의 테스트 함수를 의미하고, TDD는 하나의 프로그래밍 습...
Java Exception
제이슨의 Exception 강의를 들으면서 공부한 내용을 정리해보자. Exception 상속 구조 자바의 Exception은 위와 같은 상속 구조를 가진다. 여기서 RuntimeException을 제외한 Exception을 상속하는 모든 예외는 Checked Exception으로 분류된다. RuntimeException을 상속하는 예외들은 모두 Unc...
Java package-private 은 안쓰나요?
자동차 경주 구현 미션을 진행하던 중, 패키지 구조를 정리하다보니 접근제한자에 대한 고민이 생겨났다. “어차피 car 내부에서만 사용되는 메서드나 생성자라면… package-private으로 두는게 더 좋지 않은가?” 접근제한자에 대한 생각이 마구마구 솓아났고, 접근제한 범위를 최대한 좁히라던 이펙티브 자바 내용도 떠올라 과감하게 public 접근제한...
Java 테스트와 불변, 객체
테스트만을 위한 생성자, 메서드를 구현해도 되는가? 제이슨의 말에 따르면 생성자는 많이 만들수록 클라이언트(API 사용자) 좋은 사용성을 제공해준다고 한다. 그러나 메서드는 다르다. 객체에 메서드가 많아지면 객체 복잡도와 중복 코드를 증가시킬 뿐이다. 게다가 메서드가 많아지면 단일책임의 원칙을 위배하기도 한다. 단, 그렇다고 해서 생성자가 너무 많은 ...
Java class와 instance
제이슨의 class와 instance 강의를 들으면서 공부한 내용을 정리해보자. class, intance 지금까지 우리가 구현한 메서드와 필드가 클래스 메서드와 필드 아닌가? 지금까지 우리가 구현한 메서드와 필드는 인스턴스 메서드와 인스턴스 필드이다. 클래스: 인스턴스를 생성하기 위한 틀(template). 클래스 자체만으로는 상태가 없다. 인스턴스...
Java package와 import
제이슨의 package와 import 강의를 들으면서 공부한 내용을 정리해보자. Java package OS File System의 Directory 개념과 동일하다. 이름이 다를 뿐, 실제 탐색기를 통해 찾아가면 Directory 구조로 이루어져 있다. package는 Java에서 사용하는 네이밍이다. Java는 실제 Directory path와 p...
[JUnit 5] 간단한 개요와 Annotations
현재 JUnit 5 버전을 사용중이므로, 5 버전을 기준으로 정리를 진행했다. JUnit 공식문서 에서 지루한 JUnit의 개요 등을 설명하는데… 그런건 필요할 때 공식 문서를 다시 참고하고, 사용해본 것들에 대해서만 계속 추가하면서 정리하자. main method vs JUnit main method는 우리가 흔하게 잘 알고 있는 그 main met...
[Agile Java] Lesson05 인터페이스와 폴리모피즘
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system Collections & Comparable CourseReport 클래스에는 아래와 같은 sessions 리스트가 정의되어 있다. public class CourseReport { private final List<Co...
[Effective-Java] 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! “소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다. 하지만 아무런 득이 없을 뿐더러 심각한 위험을 감수해야 하는 행위다. 이렇게 하면 한 클래스를 여러 가지로 정의할 수 있으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저...
[Effective-Java] 아이템 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! ☃️ 태그 달린 클래스 책에서 이야기하는 태그란 해당 클래스가 어떠한 타입인지 정보를 갖고 있는 필드(멤버 변수) 를 의미한다. 태그를 이용하면 하나의 클래스로 두 가지 이상의 타입을 표현(정의)할 수 있다. 태그 달리 클래스의 예시부터 살펴보자. ☃️ 태그 달린 클...
[Effective-Java] 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 🔌 인터페이스와 default 메서드 “자바 8 이전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다. 인터페이스에 메서드를 추가하면 보통은 컴파일 오류가 나는데, 추가된 메서드가 우연히 기존 구현체에 이미 존재할 가능성이 아주 낮기 때문...
[Agile Java] Lesson04 클래스 메서드와 필드
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system 메서드는 한 가지 일만 하도록 해야한다 “객체의 상태를 바꾸거나 정보를 반환하는 것 중 한가지만을 하도록 메서드를 디자인 해야 한다.” 즉 필드를 바꾸는 동작(setter)을 수행하면 그것만 하고, 필드를 반환하는 동작(getter)...
[Effective-Java] 아이템 17. 변경 가능성을 최소화하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! ⛑️ 불변 클래스 “불변 클래스란 간단히 말해 인스턴스의 내부 값을 수정할 수 없는 클래스다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다.” “불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여...
[Effective-Java] 아이템 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 🚫 흔하게 실수하는 클래스 “이따금 인스턴스 필드들을 모아놓는 일 외에는 아무 목적도 없는 퇴보한 클래스를 작성하려 할 때가 있다.” class Point { public double x; public double y; } 초장부터 😮뜨끔! 하게 만드는 이야기다. 설...
[Effective-Java] 아이템 15. 클래스와 멤버의 접근 권한을 최소화하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 우리는 알약을 먹을 때 “감기약, 두통약, 소화제” 로만 생각하고 먹을 뿐, 알약 내부에 어떤 약품들이 들어있는지 신경쓰지 않는다. 알약은 잘 설계된 컴포넌트다. “어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 ...
[Agile Java] Lesson03 문자열과 패키지
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system 문자열은 생성자를 사용하지 마라 이유 1. 생성자 매개변수로 넘겨진 문자열과, 생성된 객체의 기능이 완전히 동일하다. Java 관련 어시스트 기능을 제공하는 IDE에서는 생성자를 사용하면 부적절(불필요)하다는 알림이 뜰 정도다. 이유...
[Agile Java] Lesson02 자바의 기초
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system 클래스 필드는 추상화로부터 클래스가 가질 필드는 추상화를 통해 불필요한 특징을 배제하고 프로그램에 필요한 핵심 특징들만 추려내는 것이 중요하다. 객체지향은 동작을 모델화 하는 것이다! 그러나… 객체지향은 동작을 모델화하는 것이기 때문...
[Effective-Java] 아이템 14. Comparable을 구현할지 고려하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! Comparable.compareTo Comparable 인터페이스는 compareTo 단 하나의 메서드만 가지고 있다. 그래서 “Comparable 인터페이스를 구현한다.” 는 말은, “comapreTo 메서드를 구현한다.” 라는 말과 같다. compareTo 메서...
[Agile Java] An Agile Overview
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system 소프트웨어를 만들 때 항상 따라야 하는 절차 분석 : 소프트웨어가 어때야 하는지 요구사항을 모으고 교정해서 만듦새 결정 계획 : 개발이 얼마나 오래 걸릴지 판단 디자인 : 만든 것을 어떻게 합할지 결정 코딩 : 개발 테스트 : 동작 ...
[Effective-Java] 아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 🙅♂️ 문자열은 다른 값 타입을 대신하기에 적합하지 않다. 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 사용하지만, 입력된 데이터가 진짜 문자열일 때만 문자열을 사용하는게 좋다. 받은 데이터가 수치형이라면 int, float, BigInte...
[Effective-Java] 아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 🤔 박싱된 기본 타입? 기본 타입 (Primitive Type) int, long, short, double, char, boolean 참조 타입 (Reference Type) String, Integer, Long, Double, Boolean 박싱된 기본 타입: ...
[Effective-Java] 아이템 58. 전통적인 for 문보다는 for-each 문을 사용하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 💡 while 문보다는 낫지만, 조금은 아쉬운 for 문 // 컬렉션 순회하기 1 - iterator(반복자) 사용 for(Iterator<element> i = c.iterator(); i.hasNext();){ Element e = i.next(); ....
[Java : 프로그래머스] N개의 최소공배수
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/12953?language=java 🎯 풀이 배열의 숫자 중 가장 큰 숫자를 기준 값으로 선정한다. 기준 값을 배열의 숫자들로 나눈다. 나머지가 0이 아닌 숫자가 하나라도 있을 경우, 기준 값을 +1 시키고 반복. 모든 숫자로 나눈 나머지가 0일 경우,...
[Effective-Java] 아이템 57. 지역변수의 범위를 최소화하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 💡 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 흔히 지역변수라 하면 함수 내부에 속한 변수만을 떠올리겠지만, 함수 뿐만 아니라 for, while, if 등 키워드에 속하는 변수들도 모두 같읕 의미의 지역변수다....
[Effective-Java] 아이템 6. 불필요한 객체 생성을 피하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 💡 String 객체 생성 패턴 String s = new String("bikini"); // 문자열 new 생성자 사용 방식 책에선 위와 같은 String객체 생성을 저어어얼대 해선 안된다고 한다. 왜 위 같이 String객체를 생성하면 안된다고 하는 것일까? 이...
[Effective-Java] 아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 👍 장점 1. 이름을 가질 수 있다. 이름을 통해 생성자가 입력 받는 매개변수가 어떻게 사용될지 객체의 특성 묘사가 가능해진다. 생성자 public class Fruit{ int price; public Fruit(int price){ this.price = pric...
[Java : 프로그래머스] 카펫
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42842?language=java 🎯 풀이 전체 카펫(사각형)의 넓이를 생각하고 접근해야 brown 개수에도 알맞는 정답이 나온다. 문제에서 구해야하는 가로, 세로 길이의 합은 (brown+4)/2 로 구할 수 있다. 더해지는 4는 모서리 4개다. c...
[Java : 프로그래머스] 소수 찾기
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42839?language=java 🎯 풀이 소수 판별은 똑똑한 수학자들이 만들어놓은 만능 풀이법이 있기 때문에 구현이 간단하다. 1은 소수가 아니다. 2는 유일한 짝수 소수다. 모든 짝수는 소수가 아니다. 그 외의 홀수는 3,5,7,9, … , 제곱근...
[Java : 프로그래머스] 네트워크
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/43162 🎯 풀이 ❌ 상하좌우 풀이 class Solution { public int solution(int n, int[][] computers) { int answer = 0; for(int x = 0; x < computers.length;...
[Java : 프로그래머스] 모의고사
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42840?language=java 🎯 풀이 단순 구현 문제. import java.util.*; class Solution { public int[] solution(int[] answers) { // 패턴 3개 초기화. int[] pattern1 =...
[Java : 프로그래머스] 프린터 🖨️
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42587?language=java 🎯 풀이 priority와 index를 한꺼번에 관리하기 위해 구조체(Class)생성. 구조체화 시킨 데이터를 Queue에 삽입. Queue 루프를 돌면서 Priority 비교 Priority가 제일 크다면, Queu...
[Java : 프로그래머스] 전화번호 목록
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42577?language=java 🎯 풀이 문제 분류는 Hash로 분류되어 있지만, 자바는 Hash없이 처리가 가능하다. 자바의 String 클래스는 접두사와 접미사 관련 메소드를 지원한다. startWith과 endWith이 그 주인공이다. 좋은 메...
[Java : 프로그래머스] 위장
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42578?language=java 🎯 풀이 점화식을 찾아내면 Hash는 그저 배열 분류용도로만 사용된다. ((모자개수 + 1) * (하의개수 + 1) * (겉온개수 + 1) * …) - 1 Hash의 value로 들어간 list나 array의 길이값+...
[Java : 프로그래머스] 완주하지 못한 선수
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42576?language=java 🎯 풀이 ❌ ArrayList를 이용한 풀이 ArrayList에 참가자 명단을 삽입한다. ArrayList에서 완주자들을 제거한다. import java.util.*; class Solution { public Str...
[Java : 프로그래머스] 다리를 지나는 트럭
문제 https://programmers.co.kr/learn/courses/30/lessons/42583?language=java 풀이 Queue로 사용할 데이터들의 전처리를 진행한다. 출발하는 트럭 배열을 Trucks Queue로 재선언한다. Bridge의 길이만큼 무게 0으로 채워둔 Bridge Queue를 선언한다. 알고리즘 시작. Bridge...
[Java : 프로그래머스] H-Index
📝 문제 https://programmers.co.kr/learn/courses/30/lessons/42747?language=java 🎯 풀이 원리는 “인용된 횟수가 N을 넘어가는 N개의 논문”을 찾는 것이다. 즉, 인용 횟수가 많은 논문부터 개수를 1개씩 카운트하면서, 인용 횟수와 논문개수 카운트가 교차하는 지점이 정답이 된다. 이를 코드로 구현하...
[Java : 프로그래머스] 체육복
문제 https://programmers.co.kr/learn/courses/30/lessons/42862 풀이 자바가 갖고 있는 자료구조나 클래스들에 익숙해지기 위해 도전했다가 int와 Integer의 차이, ArrayList 등 많이 배운 문제. 우선 틀린 풀이부터… 1차 풀이 key값을 이용한 요소제거를 위해서 Hashtable 자료구조로 접근했...
[Java : 프로그래머스] 주식가격
문제 https://programmers.co.kr/learn/courses/30/lessons/42584?language=java 풀이 시간을 기록할 빈 배열을 선언한다. 탐색(루프) 진행. 뒤에 남은 원소만큼 증가연산을 진행한다. 뒤에 남은 원소 중 더 작은 원소를 발견하면 루프를 탈출한다! class Solution { public int[] s...
[Java : 프로그래머스] 기능개발
문제 https://programmers.co.kr/learn/courses/30/lessons/42586?language=java 풀이 가장 앞에 들어있는 요소를 이용해야하므로, 큐를 이용해 접근해야한다. ((100 - 진행량) / 작업속도)의 올림 값(남은일)을 구한다. 큐가 비어있지 않고, 큐의 가장 앞의 값보다 방금 구한 값이 더 클 경우! 큐...
[Java : 프로그래머스] 가장 큰 수
내 블로그에 처음으로 댓글이 달렸던 그 문제! 이번엔 자바로 풀어보자. 문제 https://programmers.co.kr/learn/courses/30/lessons/42746 풀이 1차 풀이 Hastable을 이용한 접근을 시도했다. Key에는 4자리수 이상으로 키워낸 문자열 대입. Value에는 원본 정수모양 문자열 대입. Key 기준 내림차순 ...
[Java : 프로그래머스] K번째수
문제 https://programmers.co.kr/learn/courses/30/lessons/42748?language=java 풀이 문제 지문 그대로 구현하면 된다. import java.util.*; class Solution { public int[] solution(int[] array, int[][] commands) { // 정답 배열 ...
[Java : 프로그래머스] 2016년
NHN 코딩테스트를 앞두고 있는데, C, C++, Java 3개 언어로만 응시가 가능하다. 임베디드 과목 수강하면서 꾸준히 사용했던 C로 응시할까 했는데, Java에 익숙해 질 겸 Java 응시를 결정했다. 문제 https://programmers.co.kr/learn/courses/30/lessons/12901?language=java# 풀이 cla...
우아한테크코스
내가 꿈꾸는 프로그래머로서의 삶
우아한테크코스 레벨4 글쓰기 미션 - 내가 꿈꾸는 프로그래머로서의 삶 로 작성했던 글이다. TMI가 너무 많아 블로그에 글을 올릴까말까 고민하다가… ‘이런 나도 나니까!’ 마음 먹고 홀라당 올려버리기로! 👨💻 내가 꿈꾸는 프로그래머로서의 삶 “지금 연봉 2,000 만 원을 준다고 해도 프로그래머 할 거예요?” 점심시간 주꾸미 볶음을 음미하던 내게 포...
팀 프로젝트가 나에게 남긴 것
우아한테크코스 레벨3 글쓰기 미션 - 팀 프로젝트가 나에게 남긴 것 로 작성했던 글이다! 우아한형제들 기술블로그에도 기재되었다!! 깃허브 프로필을 뒤적거리다 오랜만에 마주친, 대학교 팀 프로젝트 저장소에 눈길이 간다. ‘이거 어떻게 만들었더라…’ 서버를 구성하고 애플리케이션으로 데이터를 전송한다는 대략적인 흐름만 주마등처럼 지나간다. 어떤 기술을 사용...
우테코에서 찾은 나만의 효과적인 공부법
우아한테크코스 레벨2 글쓰기 미션 - 우테코에서 찾은 나만의 효과적인 공부법 로 작성했던 글이다! 기록이라도 하자 ‘이 정도는 기억하겠지? 곧 써먹을 일이 있을 거야.’ 안일한 생각으로 잊혀진 개념이 몇 개 일까? 그것들만 모아도 책 한 권을 쓸 거 같다. 사실, 무얼 잊었는지조차 생각나지 않는다. ‘아! 이거 아는 건데….’ 머리를 ‘탁’ 치면서 터...
우아한테크코스 레벨2 회고
레벨1에서는 미션마다 회고를 작성했는데, 레벨2에서는 미션에 치여서 정신없게 지내다 보니 블로그 포스팅이 어려웠다.. 준호(제이)님과 점심식사 자리에서 준호님이 “미션당 회고 어려울거에요 ㅋㅋ” 라고 하셨었는데, 현실이 되었다.. (미션당 회고는 고사하고, 레벨당 회고만 진행해도 잘 하는게 아닐까 합리화가 시작된다 😅) 레벨 막바지에 진행한 테코톡이 ...
우아한테크코스 레벨1 학습로그 모의 면접 회고
면접 결과 정리 좋았던 점 당당한 시선처리 + 차분한 말투 모르는 점은 모른다고 인정 답변에 자신만의 생각이 들어가있는 점, 철학이 담겨져 있는게 느껴졌다 설명에 손 제스쳐를 잘 활용한다. 면접관과 단순한 질문과 대답이 아닌, 서로 대화를 한다는 느낌이 들었다. 대답을 논리적으로 일목요연하게 하려는게 느껴졌다. 아쉬운 점 손 제스쳐가 과하다, 가끔은 ...
우아한테크코스 체스 미션 회고
7, 8, 9주차 기간동안 진행된 체스 미션에 대한 회고를 작성한다. https://github.com/woowacourse/java-chess/pull/207 https://github.com/woowacourse/java-chess/pull/240 HTML, CSS, JS 가 뒤엉켜서 괴로웠던 체스미션… 백엔드를 선택하기 정말 잘했다고 느낀 미션이...
우아한테크코스 블랙잭 미션 회고
5, 6주차 기간동안 진행된 블랙잭 미션에 대한 회고를 작성한다. https://github.com/woowacourse/java-blackjack/pull/147 https://github.com/woowacourse/java-blackjack/pull/200 블랙잭은 우아한테크코스 레벨1 기간동안 가장 많은 충격을 받았던 미션이었다. 제이슨의 유한...
우아한테크코스 한 달 생활기
우아한테크코스 레벨1 글쓰기 미션 - 우아한테크코스 한 달 생활기 로 작성했던 글이다! 한 달간 생활하면서 깨달은 소프트스킬의 중요성에 대해 소설처럼 풀어내고자 했다. 🍚 밥부터 먹고 할까요? 무아지경(無我之境)이라는 사자성어를 좋아한다. 이어폰에서 흘러나오는 노래가 들리지 않고, 시야가 노트북 모니터 정도로 좁아진다. 배가 고프다는 사실도 까맣게 잊...
우아한테크코스 로또 미션 회고
3, 4주차 기간동안 진행된 로또 미션에 대한 회고를 작성한다. https://github.com/woowacourse/java-lotto/pull/275 https://github.com/woowacourse/java-lotto/pull/309 💡 컨트롤러는 비즈니스 로직을 알 필요가 없다 레이싱 게임 미션을 진행하면서까지 생각했던 MVC 구조는 아...
추상 클래스를 왜 쓰나요?
👓 추상 클래스를 왜? 블랙잭 미션 피드백 강의의 핵심은 “객체지향의 다형성을 이용한 조건문 줄이기” 였다. 게임 내 규칙을 자바 객체로 추상화한다. 힛(Hit): 처음 2장의 상태에서 카드를 더 뽑는 것 스테이(Stay): 카드를 더 뽑지 않고 차례를 마치는 것 블랙잭(Blackjack): 처음 두 장의 카드 합이 21인 경우, 베팅 금액의 1.5배...
깃 브랜치 전략
(당시 제이슨의 심정 추측) 우아한테크코스가 시작되었던 첫주차 주말, Racing Car 미션 저장소의 브랜치들이 모두 사라지는 사고가 발생했었다. 크루원들의 브랜치명이 잘못되었다는 것을 알아차리고 재빠르게 브랜치들을 복구한 제이슨. 그리고 그 과정을 지켜보던 웨지가 “어떤 브랜치를 사용하건 커밋은 커밋인데 왜 브랜치 나누기를 중요시하지?” 라는 의문...
TDD와 단위 테스트는 서로 다르다
🧪 많이들 하는 착각 많이들 착각하는데, “단위 테스트를 만든다” 와 “TDD를 한다” 를 다르게 생각해야한다. 포비의 말을 듣고 뜨끔했다. 고작 단위 테스트를 몇 개 만들고 실행시킨 것으로 나 자신이 TDD를 지키고 있다고 착각한건 아니었나 되돌아보게 된다. 단위 테스트는 말 그대로 작은 단위의 테스트 함수를 의미하고, TDD는 하나의 프로그래밍 습...
Java Exception
제이슨의 Exception 강의를 들으면서 공부한 내용을 정리해보자. Exception 상속 구조 자바의 Exception은 위와 같은 상속 구조를 가진다. 여기서 RuntimeException을 제외한 Exception을 상속하는 모든 예외는 Checked Exception으로 분류된다. RuntimeException을 상속하는 예외들은 모두 Unc...
우아한테크코스 자동차 경주 미션 회고
1, 2주차 기간동안 진행된 자동차 경주 게임 미션에 대한 회고를 작성한다. https://github.com/woowacourse/java-racingcar/pull/181 https://github.com/woowacourse/java-racingcar/pull/199 테스트를 하고 안하고의 기준은 신뢰도 난수를 어떻게 테스트 하는가? 난수를 테스...
Java 테스트와 불변, 객체
테스트만을 위한 생성자, 메서드를 구현해도 되는가? 제이슨의 말에 따르면 생성자는 많이 만들수록 클라이언트(API 사용자) 좋은 사용성을 제공해준다고 한다. 그러나 메서드는 다르다. 객체에 메서드가 많아지면 객체 복잡도와 중복 코드를 증가시킬 뿐이다. 게다가 메서드가 많아지면 단일책임의 원칙을 위배하기도 한다. 단, 그렇다고 해서 생성자가 너무 많은 ...
우아한테크코스 보이는 라디오 회고
제이슨이 파워포인트로 만든 100점짜리 표지 부끄러움에 볼덩이가 불덩이처럼 달아올랐던 보이는 라디오 팀 프로젝트가 끝났다. 일주일도 채 안되는 시간 동안 처음보는 크루들과 급작스럽게 팀으로 결성되어, 상황과 대본을 준비하고 몇 차례의 리허설 끝에 5분 남짓한 시간동안 발표를 진행했다. 많은 팀들이 재밌는 상황극을 많이 보여줬고, 진짜 너털 웃음 칠만큼...
Java class와 instance
제이슨의 class와 instance 강의를 들으면서 공부한 내용을 정리해보자. class, intance 지금까지 우리가 구현한 메서드와 필드가 클래스 메서드와 필드 아닌가? 지금까지 우리가 구현한 메서드와 필드는 인스턴스 메서드와 인스턴스 필드이다. 클래스: 인스턴스를 생성하기 위한 틀(template). 클래스 자체만으로는 상태가 없다. 인스턴스...
Java package와 import
제이슨의 package와 import 강의를 들으면서 공부한 내용을 정리해보자. Java package OS File System의 Directory 개념과 동일하다. 이름이 다를 뿐, 실제 탐색기를 통해 찾아가면 Directory 구조로 이루어져 있다. package는 Java에서 사용하는 네이밍이다. Java는 실제 Directory path와 p...
우아한테크코스 3기 최종 합격
우아한테크코스 웹 백엔드 3기에 최종 합격했다. 아직도 가슴이 벌렁거린다. 며칠 걸려 작성했던 자기소개서, 4시간 동안 응시한 1차 코딩 테스트, 3주간 진행된 프리코스, 5시간 동안 응시한 최종 코딩 테스트까지. 우테코 선발 과정도 즐거웠지만, 그 속에서 여러 개발 블로거 분들과 공통 관심분모로 자연스레 소통했던 것이 잊혀지지 않는다. 그래서 더욱 ...
우테코 프리코스가 내게 남긴 것
2020년 12월 15일 화요일을 기준으로 우아한 테크코스 3기 프리코스가 종료되었다. 우아한테크코스 3기 지원 후기 우아한테크코스 3기 웹 백엔드 프리코스 회고 프리코스 마지막 테스트를 준비하는 겸 1~3주차 미션들을 처음부터 다시 진행해봤다. 미션들을 모두 새로 완성하고 나니, 프리코스 이후 내가 무엇이 달라졌는지 보이기 시작했다. 많은 것들이 바...
우아한테크코스 3기 웹 백엔드 프리코스 회고
2020년 12월 15일 화요일을 기준으로 우아한 테크코스 3기 프리코스가 종료되었다. 우아한 테크코스 지원 과정은 우아한테크코스 3기 지원 후기 포스트에 작성해두었다! 이번 포스트는 프리코스를 진행했던 과정과 배운 내용 등을 정리해보고자 한다. ⚾ 1주차 미션 - 숫자야구게임 숫자를 입력해주세요 : 123 1볼 1스트라이크 숫자를 입력해주세요 : 1...
우아한테크코스 3기 지원 후기
👨💻 우아한테크코스 3기 우아한테크코스 3기 백엔드를 지원하고, 오늘 온라인 코딩 테스트를 진행했다. 사실 프론트/백 선택과 자소서 작성부터 엄청 애를 먹었었다. 프론트/백 둘다 좋아하는지라 둘 중 하나를 골라야한다는게 굉장히 골치 아팠다. 그러나 어쩌겠는가? 결국은 선택해야하는 것을… 고민을 OKKY에 질문하기도 하고 직접 미니 프로젝트를 진행하기...
reading books
reading books / 소프트웨어 장인
책을 읽기 전에 나는 개인적으로 자기계발 서적을 좋아하지 않는다. 혹여나 읽게 된다면 굉장히 방어적이고, 비판적인 태도로 읽는다. 학부 2학년 때 읽었던 ‘긍정의 배신’이라는 책이 이러한 태도를 갖게한 주범이었다. ‘긍정의 배신’은 긍정 이데올로기에 취해있는 우리 사회에서 맹목적인 긍정이 얼마나 잘못된 것인지, 쓸데 없는지에 대해 신랄하게 비판하는 책...
[Agile Java] Lesson05 인터페이스와 폴리모피즘
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system Collections & Comparable CourseReport 클래스에는 아래와 같은 sessions 리스트가 정의되어 있다. public class CourseReport { private final List<Co...
[Effective-Java] 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! “소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다. 하지만 아무런 득이 없을 뿐더러 심각한 위험을 감수해야 하는 행위다. 이렇게 하면 한 클래스를 여러 가지로 정의할 수 있으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저...
[Effective-Java] 아이템 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! ☃️ 태그 달린 클래스 책에서 이야기하는 태그란 해당 클래스가 어떠한 타입인지 정보를 갖고 있는 필드(멤버 변수) 를 의미한다. 태그를 이용하면 하나의 클래스로 두 가지 이상의 타입을 표현(정의)할 수 있다. 태그 달리 클래스의 예시부터 살펴보자. ☃️ 태그 달린 클...
[Effective-Java] 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 🔌 인터페이스와 default 메서드 “자바 8 이전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다. 인터페이스에 메서드를 추가하면 보통은 컴파일 오류가 나는데, 추가된 메서드가 우연히 기존 구현체에 이미 존재할 가능성이 아주 낮기 때문...
[Agile Java] Lesson04 클래스 메서드와 필드
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system 메서드는 한 가지 일만 하도록 해야한다 “객체의 상태를 바꾸거나 정보를 반환하는 것 중 한가지만을 하도록 메서드를 디자인 해야 한다.” 즉 필드를 바꾸는 동작(setter)을 수행하면 그것만 하고, 필드를 반환하는 동작(getter)...
[Effective-Java] 아이템 17. 변경 가능성을 최소화하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! ⛑️ 불변 클래스 “불변 클래스란 간단히 말해 인스턴스의 내부 값을 수정할 수 없는 클래스다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다.” “불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여...
[Effective-Java] 아이템 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 🚫 흔하게 실수하는 클래스 “이따금 인스턴스 필드들을 모아놓는 일 외에는 아무 목적도 없는 퇴보한 클래스를 작성하려 할 때가 있다.” class Point { public double x; public double y; } 초장부터 😮뜨끔! 하게 만드는 이야기다. 설...
[Effective-Java] 아이템 15. 클래스와 멤버의 접근 권한을 최소화하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 우리는 알약을 먹을 때 “감기약, 두통약, 소화제” 로만 생각하고 먹을 뿐, 알약 내부에 어떤 약품들이 들어있는지 신경쓰지 않는다. 알약은 잘 설계된 컴포넌트다. “어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 ...
[Agile Java] Lesson03 문자열과 패키지
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system 문자열은 생성자를 사용하지 마라 이유 1. 생성자 매개변수로 넘겨진 문자열과, 생성된 객체의 기능이 완전히 동일하다. Java 관련 어시스트 기능을 제공하는 IDE에서는 생성자를 사용하면 부적절(불필요)하다는 알림이 뜰 정도다. 이유...
[Agile Java] Lesson02 자바의 기초
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system 클래스 필드는 추상화로부터 클래스가 가질 필드는 추상화를 통해 불필요한 특징을 배제하고 프로그램에 필요한 핵심 특징들만 추려내는 것이 중요하다. 객체지향은 동작을 모델화 하는 것이다! 그러나… 객체지향은 동작을 모델화하는 것이기 때문...
[Effective-Java] 아이템 14. Comparable을 구현할지 고려하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! Comparable.compareTo Comparable 인터페이스는 compareTo 단 하나의 메서드만 가지고 있다. 그래서 “Comparable 인터페이스를 구현한다.” 는 말은, “comapreTo 메서드를 구현한다.” 라는 말과 같다. compareTo 메서...
[Agile Java] An Agile Overview
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system 소프트웨어를 만들 때 항상 따라야 하는 절차 분석 : 소프트웨어가 어때야 하는지 요구사항을 모으고 교정해서 만듦새 결정 계획 : 개발이 얼마나 오래 걸릴지 판단 디자인 : 만든 것을 어떻게 합할지 결정 코딩 : 개발 테스트 : 동작 ...
[Effective-Java] 아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 🙅♂️ 문자열은 다른 값 타입을 대신하기에 적합하지 않다. 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 사용하지만, 입력된 데이터가 진짜 문자열일 때만 문자열을 사용하는게 좋다. 받은 데이터가 수치형이라면 int, float, BigInte...
[Effective-Java] 아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 🤔 박싱된 기본 타입? 기본 타입 (Primitive Type) int, long, short, double, char, boolean 참조 타입 (Reference Type) String, Integer, Long, Double, Boolean 박싱된 기본 타입: ...
[Effective-Java] 아이템 58. 전통적인 for 문보다는 for-each 문을 사용하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 💡 while 문보다는 낫지만, 조금은 아쉬운 for 문 // 컬렉션 순회하기 1 - iterator(반복자) 사용 for(Iterator<element> i = c.iterator(); i.hasNext();){ Element e = i.next(); ....
[Effective-Java] 아이템 57. 지역변수의 범위를 최소화하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 💡 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 흔히 지역변수라 하면 함수 내부에 속한 변수만을 떠올리겠지만, 함수 뿐만 아니라 for, while, if 등 키워드에 속하는 변수들도 모두 같읕 의미의 지역변수다....
[Effective-Java] 아이템 6. 불필요한 객체 생성을 피하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 💡 String 객체 생성 패턴 String s = new String("bikini"); // 문자열 new 생성자 사용 방식 책에선 위와 같은 String객체 생성을 저어어얼대 해선 안된다고 한다. 왜 위 같이 String객체를 생성하면 안된다고 하는 것일까? 이...
2020-11-02 이펙티브자바 첫 스터디
최근 이펙티브자바 스터디를 시작했다. “아직 자바에 익숙하지도 않은 놈이 이펙티브자바를 읽어도 되나?” 라는 생각이 들었지만, 오히려 자바에 익숙하지 않기 때문에 더 쉽게 흡수할 수 있을거라는 믿음으로 시작했다. 이펙티브자바 아이템1: 생성자 대신 정적 팩터리 메서드를 고려하라로 시작했는데, 발표 이후 스터디원분들이 “뭐라는거야… 못 알아 먹겠어…”...
[Effective-Java] 아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 👍 장점 1. 이름을 가질 수 있다. 이름을 통해 생성자가 입력 받는 매개변수가 어떻게 사용될지 객체의 특성 묘사가 가능해진다. 생성자 public class Fruit{ int price; public Fruit(int price){ this.price = pric...
열혈C프로그래밍을 복습하면서 배운 것들
# 1학년 과목을 재수강 하고 있다. 새내기 시절 ‘정말 저렇게 살아도 될까?’ 싶을 정도로 학교생활을 즐겨서 전공 과목 점수가 영 순탄하지 못했다. (후회는 없다! 잘 놀았어! 🤤) 그 중에서도 가장 기본이 되는 C프로그래밍 과목 점수들이 모두 C+ + 하나만 더 있으면 C++이 되겠는데? 다행히 복학 후 학업에 관심을 갖게 되면서 학점을 야금야금 ...
MySQL
ReverseProxy-WAS-DB 서버 구성하기
AWS-EC2 인스턴스 3개를 이용해서 위 그림과 같은 서버를 구성할 수 있다. 우선 AWS-EC2를 3개 생성한 후 진행된다. Reverse Proxy - docker + nginx Reverse Proxy로 사용하기 위한 EC2 인스턴스에 접속 후 아래 명령어를 통해 도커를 설치한다. $ sudo apt-get update && \ ...
[SQL : 프로그래머스] 중성화 여부 파악하기
문제 https://programmers.co.kr/learn/courses/30/lessons/59409 풀이 SELECT ANIMAL_ID, NAME, IF(SEX_UPON_INTAKE LIKE 'Intact%', 'X', 'O') AS 중성화 FROM ANIMAL_INS ORDER BY ANIMAL_ID IF 절을 사용할 줄 안다면 쉽게 풀 수 ...
[SQL : 프로그래머스] 있었는데요 없었습니다
문제 https://programmers.co.kr/learn/courses/30/lessons/59043?language=mysql 풀이 SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME FROM ANIMAL_INS JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID=ANIMAL_OUTS.ANIMA...
[SQL : 프로그래머스] 입양 시각 구하기(2)
문제 https://programmers.co.kr/learn/courses/30/lessons/59413?language=mysql 풀이 갑자기 안풀려서 답답했던 문제였는데, 알고보니 LEVEL 4 였다더라~ SET을 통해 변수를 설정해야 쉽게 풀 수 있는 문제였다. SET @hour := -1; SELECT (@hour := @hour+1) as ...
[SQL : 프로그래머스] 오랜 기간 보호한 동물(2)
문제 https://programmers.co.kr/learn/courses/30/lessons/59411 풀이 SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME FROM ANIMAL_INS INNER JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID=ANIMAL_OUTS.ANIMAL_ID ORDE...
[SQL : 프로그래머스] 오랜 기간 보호한 동물(1)
문제 https://programmers.co.kr/learn/courses/30/lessons/59044 풀이 SELECT ANIMAL_INS.NAME, ANIMAL_INS.DATETIME FROM ANIMAL_INS LEFT JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID=ANIMAL_OUTS.ANIMAL_ID WHERE ...
[SQL : 프로그래머스] 보호소에서 중성화한 동물
문제 https://programmers.co.kr/learn/courses/30/lessons/59045 풀이 중요한 것을 잃은 문제! SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.ANIMAL_TYPE, ANIMAL_INS.NAME FROM ANIMAL_INS INNER JOIN ANIMAL_OUTS ON ANIMAL_IN...
[SQL : 프로그래머스] DATETIME에서 DATE로 형 변환
문제 https://programmers.co.kr/learn/courses/30/lessons/59414 풀이 SELECT ANIMAL_ID, NAME, date_format(DATETIME, '%Y-%m-%d') AS '날짜' FROM ANIMAL_INS ORDER BY ANIMAL_ID 쉬운 문제의 경우 되도록 포스팅을 자제하려고 하는데 date...
[SQL : 프로그래머스] 중복 제거하기
문제 https://programmers.co.kr/learn/courses/30/lessons/59408 풀이 SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME!='' 중복제거가 DISTINCT인건 인지하고 있었는데, COUNT함수로 묶을 수 있다는 건 테스트하면서 깨달았다. NULL은 역시 그대로 쓰...
[SQL : 프로그래머스] 입양 시각 구하기(1)
문제 https://programmers.co.kr/learn/courses/30/lessons/59412?language=mysql 풀이 SELECT HOUR(DATETIME), COUNT(HOUR(DATETIME)) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19 ...
[SQL : 프로그래머스] 없어진 기록 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/59042 풀이 SELECT ANIMAL_ID, NAME FROM ANIMAL_OUTS WHERE ANIMAL_ID NOT IN ( SELECT ANIMAL_ID FROM ANIMAL_INS) JOIN 으로 풀기가 권장되는 문제지만, IN 을 알고 있다면 ...
[SQL : 프로그래머스] 상위 n개 레코드
문제 https://programmers.co.kr/learn/courses/30/lessons/59405 풀이 SELECT NAME FROM ANIMAL_INS WHERE DATETIME=(SELECT MIN(DATETIME) FROM ANIMAL_INS) SELECT 구절이 두 번 사용된다는 것은 아쉽지만, MIN 함수를 이용해서 최소값을 잡아내는...
[SQL : 프로그래머스] 동명 동물 수 찾기
문제 https://programmers.co.kr/learn/courses/30/lessons/59041 풀이 SELECT NAME, COUNT(NAME) FROM ANIMAL_INS GROUP BY NAME HAVING COUNT(NAME) > 1 ORDER BY NAME WHERE 는 집계함수를 사용 할 수 없다. HAVING 은 집계함수를...
[SQL : 프로그래머스] 고양이와 개는 몇 마리 있을까
문제 https://programmers.co.kr/learn/courses/30/lessons/59040 풀이 SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) FROM ANIMAL_INS GROUP BY ANIMAL_TYPE ORDER BY ANIMAL_TYPE 갑작스럽게 GROUP BY가 떠오르지 않아 질문 게시판을 참고했다....
[SQL : 프로그래머스] NULL 처리하기
문제 https://programmers.co.kr/learn/courses/30/lessons/59410 풀이 SELECT ANIMAL_TYPE, IF(NAME IS NULL, 'No name', NAME) AS NAME, SEX_UPON_INTAKE FROM ANIMAL_INS IF문을 이용해서 NAME IS NULL이 참이라면 No name, 아...
Effective Java
[Effective-Java] 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! “소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다. 하지만 아무런 득이 없을 뿐더러 심각한 위험을 감수해야 하는 행위다. 이렇게 하면 한 클래스를 여러 가지로 정의할 수 있으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저...
[Effective-Java] 아이템 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! ☃️ 태그 달린 클래스 책에서 이야기하는 태그란 해당 클래스가 어떠한 타입인지 정보를 갖고 있는 필드(멤버 변수) 를 의미한다. 태그를 이용하면 하나의 클래스로 두 가지 이상의 타입을 표현(정의)할 수 있다. 태그 달리 클래스의 예시부터 살펴보자. ☃️ 태그 달린 클...
[Effective-Java] 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 🔌 인터페이스와 default 메서드 “자바 8 이전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다. 인터페이스에 메서드를 추가하면 보통은 컴파일 오류가 나는데, 추가된 메서드가 우연히 기존 구현체에 이미 존재할 가능성이 아주 낮기 때문...
[Effective-Java] 아이템 17. 변경 가능성을 최소화하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! ⛑️ 불변 클래스 “불변 클래스란 간단히 말해 인스턴스의 내부 값을 수정할 수 없는 클래스다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다.” “불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여...
[Effective-Java] 아이템 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 🚫 흔하게 실수하는 클래스 “이따금 인스턴스 필드들을 모아놓는 일 외에는 아무 목적도 없는 퇴보한 클래스를 작성하려 할 때가 있다.” class Point { public double x; public double y; } 초장부터 😮뜨끔! 하게 만드는 이야기다. 설...
[Effective-Java] 아이템 15. 클래스와 멤버의 접근 권한을 최소화하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 우리는 알약을 먹을 때 “감기약, 두통약, 소화제” 로만 생각하고 먹을 뿐, 알약 내부에 어떤 약품들이 들어있는지 신경쓰지 않는다. 알약은 잘 설계된 컴포넌트다. “어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 ...
[Effective-Java] 아이템 14. Comparable을 구현할지 고려하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! Comparable.compareTo Comparable 인터페이스는 compareTo 단 하나의 메서드만 가지고 있다. 그래서 “Comparable 인터페이스를 구현한다.” 는 말은, “comapreTo 메서드를 구현한다.” 라는 말과 같다. compareTo 메서...
[Effective-Java] 아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 🙅♂️ 문자열은 다른 값 타입을 대신하기에 적합하지 않다. 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 사용하지만, 입력된 데이터가 진짜 문자열일 때만 문자열을 사용하는게 좋다. 받은 데이터가 수치형이라면 int, float, BigInte...
[Effective-Java] 아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 🤔 박싱된 기본 타입? 기본 타입 (Primitive Type) int, long, short, double, char, boolean 참조 타입 (Reference Type) String, Integer, Long, Double, Boolean 박싱된 기본 타입: ...
[Effective-Java] 아이템 58. 전통적인 for 문보다는 for-each 문을 사용하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 💡 while 문보다는 낫지만, 조금은 아쉬운 for 문 // 컬렉션 순회하기 1 - iterator(반복자) 사용 for(Iterator<element> i = c.iterator(); i.hasNext();){ Element e = i.next(); ....
[Effective-Java] 아이템 57. 지역변수의 범위를 최소화하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 💡 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 흔히 지역변수라 하면 함수 내부에 속한 변수만을 떠올리겠지만, 함수 뿐만 아니라 for, while, if 등 키워드에 속하는 변수들도 모두 같읕 의미의 지역변수다....
[Effective-Java] 아이템 6. 불필요한 객체 생성을 피하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 💡 String 객체 생성 패턴 String s = new String("bikini"); // 문자열 new 생성자 사용 방식 책에선 위와 같은 String객체 생성을 저어어얼대 해선 안된다고 한다. 왜 위 같이 String객체를 생성하면 안된다고 하는 것일까? 이...
2020-11-02 이펙티브자바 첫 스터디
최근 이펙티브자바 스터디를 시작했다. “아직 자바에 익숙하지도 않은 놈이 이펙티브자바를 읽어도 되나?” 라는 생각이 들었지만, 오히려 자바에 익숙하지 않기 때문에 더 쉽게 흡수할 수 있을거라는 믿음으로 시작했다. 이펙티브자바 아이템1: 생성자 대신 정적 팩터리 메서드를 고려하라로 시작했는데, 발표 이후 스터디원분들이 “뭐라는거야… 못 알아 먹겠어…”...
[Effective-Java] 아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라
전체적인 스터디 내용은 JunHyeok96/effective-java에서 확인 가능! 👍 장점 1. 이름을 가질 수 있다. 이름을 통해 생성자가 입력 받는 매개변수가 어떻게 사용될지 객체의 특성 묘사가 가능해진다. 생성자 public class Fruit{ int price; public Fruit(int price){ this.price = pric...
백준
[Baekjoon-1011] Fly me to the Alpha Centauri
📝 문제 https://www.acmicpc.net/problem/1011 🎯 풀이 점진적으로 워프 속도가 증가하고, 감소한다는 것에 주목해야 한다. 1 2 3 3 2 1 -- 이건 가능하지만, 1 4 2 1 -- 이건 불가능 하다. 이 때문에 첫 번째 시도로 점진적으로 증가하는 워프 속도 횟수의 절반까지만 구한 후, 이를 2배 곱하여 총 워프 횟수를...
[Python : 백준 2630] 색종이 만들기
문제 https://www.acmicpc.net/problem/2630 풀이 최초 풀이 0, 0 좌표의 값을 저장한다. x, y 좌표까지 모두 훑으면서 0, 0 좌표와 색을 비교한다. 다른 값 발견시 4분면으로 분화시켜서 재귀를 돌린다. def slice(fromx, tox, fromy, toy): global paper, white, blue col...
[Python : 백준 9012] 괄호
문제 https://www.acmicpc.net/problem/9012 풀이 프로그래머스에서도 비슷한걸 풀었던 기억이 난다. 그때는 정수 값 +,- 로 구현 했던거 같은데… 이번에는 스택을 이용해보았다. lines = int(input()) commands = [] for _ in range(lines): commands.append(input()) ...
[Python : 백준 4949] 균형잡힌 세상
문제 https://www.acmicpc.net/problem/4949 풀이 단순 구현 문제. 정규표현식을 이용해 ()[] 만 남기는걸로 구현해보았다. import re lines = [] while True: getstring = input() if getstring == ".": break lines.append(getstring) for line...
[Python : 백준 4673] 셀프 넘버
문제 https://www.acmicpc.net/problem/4673 풀이 1~10000 까지의 값을 배열에 저장한다. 1~10000 까지 루프를 돌면서 셀프넘버를 구한다. 구한 셀프넘버를 배열에서 소거시킨다. 배열에 남은 값들을 출력시킨다. 각각의 셀프 넘버는 값이 들쭉날쭉하게 만들어지고 소거시키는 동작이 엄청 많은 시간을 잡아먹기 때문에 딕셔너리...
[Python : 백준 1874] 스택 수열
문제 https://www.acmicpc.net/problem/1874 풀이 지문이 난해해서 한참 봤던 문제. 설명이 조금 더 상세했으면 좋겠다. 1~N 까지 랜덤한 수를 입력 받는다. 1~N 까지 오름차순으로 스택에 push하면서, 입력 받은 랜덤 수를 pop한다. 스택에서 pop 해낼 수 없는 경우 “NO” 출력 n = int(input()) se...
[Python : 백준 11729] 하노이 탑 이동 순서
문제 https://www.acmicpc.net/problem/11729 풀이 하노이 탑에 대해서는 위키를 참고하자. 문제의 출력 예시에서 규칙을 찾아낼 수 있다. 하노이 탑 봉을 left, mid, right로 표기하고 설명하겠다. # 입력 예시 3 # 출력 예시 7 1 3 #1 1 2 #2 3 2 #3 1 3 #4 2 1 #5 2 3 #6 1 3 ...
[Python : 백준 10828] 스택
문제 https://www.acmicpc.net/problem/10828 풀이 단순 구현 문제. 명령어별 예외처리에 주의해서 구현하면 된다. #1, #2 로 구분해서 구현해봤는데 모두 잘 되는 것 같다. lines = int(input()) commands = [] stack = [] for i in range(lines): commands.appen...
[Python : 백준 10773] 제로
문제 https://www.acmicpc.net/problem/10773 풀이 기본 스택 구현. 0을 입력 받으면 pop 그 외엔 push 마지막에 스택의 합을 출력 stack = [] lines = int(input()) for i in range(lines): number = int(input()) if number == 0: stack.pop()...
[Python : 백준 1065] 한수
문제 https://www.acmicpc.net/problem/1065 풀이 입력되는 N의 최대 크기가 1000이기 때문에, 한수에 대한 특징만 이해한다면 어렵지 않게 구현이 가능하다. 1~9 까지의 한 자리수는 모두 한수로 취급된다. (비교자리수가 없음) 10~99 까지의 두 자리수는 모두 한수로 취급된다. (비교가 1회로 끝남) 100 이상부터의 ...
[Python : 백준 1931] 회의실배정
문제 https://www.acmicpc.net/problem/1931 한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중...
[Python : 백준 1541] 잃어버린 괄호
문제 https://www.acmicpc.net/problem/1541 풀이 괄호 개수 제한이 없기 때문에 ‘-‘를 발견하면, 이후 연산을 모두 뺄셈으로 바꿀 수 있다. 이를 코드로 옮길 때 ‘-‘를 발견하기 전 값은 더해주고 ‘-‘를 발견한 이후 값은 모두 빼주면 된다. line = input().split('-') total = 0 for i in...
[Python : 백준 11399] ATM
문제 https://www.acmicpc.net/problem/11399 풀이 지문에서 모든 힌트를 다 줬기 때문에, 그대로 코드에 옮기기만 하면 되는데 제한조건만 잘 확인하면 점화식까지 세울 필요도 없었다. 1초 제한에 N의 최대가 1,000이었기 때문에 그냥 O(n)시간 풀이로 해결해도 된다. N = int(input()) time = sorted...
[Python : 백준 11047] 동전 0
문제 https://www.acmicpc.net/problem/11047 준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다. 동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오. # 입력 예시 10 4200 1 5 10 50 100 500 1000 5...
spring
왜 조회 쿼리에서 데드락이 발생했을까?
“아니, 도대체 왜 조회 쿼리 메서드에서 데드락이 생기는거야?” 사내 시스템을 운영하던 중 처음보는 유형의 데드락이 발생하여 원인을 탐색하고, 이모저모 실험을 해본 후 남기는 트러블 슈팅 글. 실험은 항상 배우는게 많고 즐겁다. 🔒 콘텐츠 동기화 중 데드락 발생! 사내에는 수시로 비디오 콘텐츠를 동기화하는 로직이 존재한다. 대량의 콘텐츠들이 불특정 시...
Spring Boot 3 마이그레이션 팁 모음
Spring Boot 2 -> Spring Boot 3 마이그레이션은 메이저 버전 변경임에도 불구하고 비교적 쉽게 진행할 수 있다. 하지만 말 그대로 Spring Boot 마이그레이션이 쉬울 뿐, 부수적으로 생기는 문제들까지 모두 해결하는 건 쉽지 않다. 이번 글에서는 내가 Spring Boot 2 에서 Spring Boot 3 마이그레이션을 진...
spring application properties 기본 값 설정을 주의해야하는 이유
간만에 spring application properties 덕분에 고생 좀 했다. 정말 뼈저리게 고생했으니, 앞으로 까먹을 일은 없겠다. 요약 aws: s3: bucket: name: test cloudFrontBaseUrl: "https://cloudfront.url" mock: enabled: false port: 8111 위와 같이 작성되어 있...
spring retry 이해 및 예제 정리
이전 글: spring circuit breaker 이해 및 예제 정리 spring circuit breaker(Spring Cloud Circuit Breaker) 에 대해 알아보았으니, 이번엔 Spring Retry 에 대해서 알아보자. 우선 두 기술은 모두 fault-tolerance(장애허용)을 위해 사용하는 기술이다. 때문에 동작이 상당히 유...
spring circuit breaker 이해 및 예제 정리
다음 글: spring retry 이해 및 예제 정리 circuit breaker 를 처음 접하게 되었을 때 retry 와 비슷한 기능을 하는 것 같아서 자주 헷갈렸다. 특히 @Retryable 과 @Recover 를 조합하다보면 circuit breaker 와 정말 유사한 결과물을 만들 수 있다. 그러나 기술의 컨셉을 이해하고 여러가지 테스트를 해보...
@ModelAttribute을 setter 없이 사용할 수 있는 이유
많은 블로그에서 @ModelAttribute 어노테이션을 통해 데이터를 바인딩 할 때 setter 메서드가 필요하다고 했다. 그러나 실제 테스트를 진행해보니 setter 메서드 없이도 @ModelAttribute를 통한 데이터 바인딩이 성공됨을 확인할 수 있었다. // DTO public class TestRequestDto { private Stri...
Spring JDBC를 통한 DB 연동
DataSource JDBC API는 DriverManager 외에 DataSource를 이용해서 DB 연결을 구하는 방법을 정의하고 있다. DB연동 기능을 구현하고 Bean으로 등록되어 있는 객체(주로 @Repository 어노테이션을 붙인)에 DataSource를 주입하는 식으로 많이 사용한다. 아래는 DB연동 기능을 구현한 Bean 객체에 주입하...
Spring AOP
AOP(Aspect Oriented Programming)은 관점 지향 프로그래밍으로, 어떤 로직에 대해 핵심적인 관점, 부가적인 관점을 나누어 보고 그 관점들을 기준으로 각각 모듈화를 하겠다는 것이다. (모듈화 - 공통된 로직이나 기능을 하나의 단위로 묶는 것) 예를 들어 핵심적인 관점을 우리가 적용하고자 하는 핵심 비즈니스 로직. 부가적인 관점은 ...
Bean 라이프사이클과 범위
스프링 컨테이너의 라이프사이클 스프링 컨테이너는 초기화와 종료라는 라이프 사이클을 갖는다. // 컨테이너 초기화 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class); // 컨테이너 사용 Greeter g = ctx.getBean(...
스프링 설정과 의존성 주입(DI)
객체 조립기 (Assembler) 앞서 DI(의존성 주입)을 설명할 때 객체를 주입하는 방식이 유지보수에 있어 굉장한 이점을 가진다는 것을 설명했다. 그렇다면 주입이 되는 객체를 생성하는 곳은 어디여야할까? 일반적으로 가장 최상단인 main 메서드를 떠올릴 수 있다. public class Main { public static void main(Str...
component scan
@Component 클래스 선언부 위 쪽에 @Component 어노테이션을 붙이면 @Configuration 클래스에 별도로 Bean 등록 과정을 거치지 않아도 스프링이 패키지 전체를 탐색해서 Bean으로 등록 할 수 있다. @Component public class AppleDao { ... } 별도의 Bean 등록 메서드가 필요 없기 때문에 설정 ...
Autowired 어노테이션
@Autowired - 자동주입 @Configuration public class AppCtx { @Bean public MemberDao memberDao() { return new MemberDao(); } @Bean public ChangePasswordService changePwdSvc() { ChangePasswordService pwdSv...
스프링 개요
스프링 (스프링 프레임워크) 주로 스프링 프레임워크를 칭한다. 스프링 프레임워크의 주요 특징 DI(Dependency Injection) 지원 AOP(Aspect-Oriented Programming) 지원 MVC 웹 프레임워크 제공 JDBC, JPA 연동, 선언적 트랜잭션 처리 등 DB 연동 지원 스케줄링, 자바 메세지 연동(JMS), 테스트 지원 ...
review
인프콘 2023 - 코드 리뷰 테스트
🖋️ 변별력을 200% 더 높인 개발자 채용 방법: 코드 리뷰 테스트 - 전종욱님 강남언니에서는 지난 2023년 3월부터 코드리뷰 테스트를 통해 개발자 채용을 진행한다고 한다. 합격자 수와 수준을 이전과 동일하게 유지하면서도 인터뷰 진행 시간을 50% 이상 감소시켰는데, 지원자가 코드 리뷰를 남기는 모습을 보면서 회사에 어울리는 사람인지 높은 확신을 ...
인프콘 2023 - 인프런 아키텍처 2023-2024
🌱 인프런 아키텍처 2023-2024 - 이동욱님 1년만에 돌아온 인프콘, 그동안 인프런의 아키텍처에는 어떤 변화가 있었을까? 이전 글: 인프콘 2022 - 인프런 아키텍처의 과거와 현재, 그리고 미래 보통 우리가 아키텍처나 구조를 바꿀 때 가장 큰 이유가 장애 해결이나, 트래픽 문제를 해결하기 위해서다. 인프런 역시 장애 해결을 위해 레거시 아키텍처...
인프콘 2022 후기
🌱 갑자기 인프콘 월요일 퇴근 준비중, 주니어 개발자들을 금쪽이라 부르며 살갑게 챙겨주시는 정희님께 DM이 왔다. 헉…?! 당장 정희님께 가고 싶다고 답변을 드렸다. 동욱님이 준비해주신 티켓인 것도 놀라운데, 내 블로그를 보고 계신다니… 😳 예쓰! 그렇게 정희님의 은혜를 받아 인프콘에 참가할 수 있게 되었다. 정희님 다시 한번 정말 감사합니다 🙇♂️...
인프콘 2022 - 어느 날 고민 많은 주니어 개발자가 찾아왔다
🎓 어느 날 고민 많은 주니어 개발자가 찾아왔다 - 김영한님 인프런 영한님 강의 속에서 조금씩 들을 수 있었던 김영한님 성장 일대기와 성장에 관한 팁. 개발자로 취업 준비중이거나, 취업한지 얼마 안된 주니어 개발자들을 타겟으로 준비된 발표같다. 🎓 이직 - 이직 준비, 채용, 이력서, 면접 어떤 회사를 갈 것인가 부터 내가 가고 싶은 회사를 1,2,3...
인프콘 2022 - 레거시 시스템 개편의 기술
👨🍳 레거시 시스템 개편의 기술 - 권용근(킹뽀대)님 우아한형제들 권용근님의 레거시 시스템 개편 꿀팁 모음집. 우아한 멀티 모듈에서 느꼈던 감동을 비슷하게 느낄 수 있는 시간이었다. 도저히 테스트 할 수 없는 환경에서는 어떻게 안정감을 확보했는지까지… 실전형 꿀팁들이 넘쳐 흐른다. 👨🍳 레거시 개편은 왜 일어나는가? 레거시 시스템이란? 낡은 시스템...
인프콘 2022 - 개발자의 셀프 브랜딩
👨💻 개발자의 셀프 브랜딩 개발자의 셀프 브랜딩 - 김민준(벨로퍼트)님 벨로그(개발자들의 블로그 플랫폼)로 유명하신 벨로퍼트님의 개발자 셀프 브랜딩 이야기. 개발자는 나 자신을 어필하는 방법을 알아야하고, 더 나아가 그 방법이 다른 개발자들을 돕는 이로운 방식이면 더욱 좋다는 이야기를 해주셨다. 복잡한 기술 이야기보단 단순 팁들이 많았고, 팁을 이해...
인프콘 2022 - 실전! 멀티 모듈 프로젝트 구조와 설계
🍀 실전! 멀티 모듈 프로젝트 구조와 설계 - 김대성님 무려 18년된 레거시 프로젝트를 현대화적인 프로젝트로 전환하며 느낀 점과, 여러 차례 멀티 모듈 프로젝트 구성하면서 어떻게 하면 유지보수하기 좋은 멀티모듈 프로젝트를 만드는지 비법을 전수해주신다. 🍀 “WHY” 멀티 모듈 프로젝트는 왜 구조가 중요할까? “아키텍쳐는 프로젝트 초기에 이루어져야하는 ...
인프콘 2022 - 코드 리뷰의 또 다른 접근 방법: Pull Requests vs Stacked Changes
🧀 코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes - 치즈(서지연)님 Graphite를 이용한 Stacked Changes 형상관리 방법 소개와, Stacked Changes 가 현업에서 잘 어울리는 이유에 대한 이야기. 🧀 코드 리뷰를 잘 한다는 것? 코드리뷰는 꼭 해야한다. 요즘 개발자들 사이에서 ‘...
인프콘 2022 - 인프런 아키텍처의 과거와 현재, 그리고 미래
🌱 인프런 아키텍처의 과거와 현재, 그리고 미래 - 이동욱님 인프런의 아키텍처가 어떻게 변해왔는지, 그리고 왜 그렇게 변해왔는지에 대한 이야기. 목표를 일정 안에 달성하기 위해 감수해야하는 제약 조건들이 무엇인지, 그런 제약 조건 속 가장 적절한 아키텍처가 무엇인지, 인프런은 어떤 결정을 했는지 하나하나 설명해주셨다. 🌱 시즌1 인프런의 규모가 작고 ...
2022 글또콘 후기
📺 글또콘 신청 무슨 생각이었을까? 개발자로서 개발자들 앞에서 개발 이야기로 발표하고 싶다는 막연한 용기였다. 글또에서 처음으로 진행하는 글또콘에 발표자로 참가를 신청했다. 주제는 이미 블로그 글로 발행했던 테스트 코드. 그리고 첫 글또콘 발표자 중 한명으로 선정되었다. 이미 글로 풀어낸 내용이니 발표자료를 만드는데 크게 어렵지 않을거 같았다. “저희...
후기
인프콘 2023 - 코드 리뷰 테스트
🖋️ 변별력을 200% 더 높인 개발자 채용 방법: 코드 리뷰 테스트 - 전종욱님 강남언니에서는 지난 2023년 3월부터 코드리뷰 테스트를 통해 개발자 채용을 진행한다고 한다. 합격자 수와 수준을 이전과 동일하게 유지하면서도 인터뷰 진행 시간을 50% 이상 감소시켰는데, 지원자가 코드 리뷰를 남기는 모습을 보면서 회사에 어울리는 사람인지 높은 확신을 ...
인프콘 2023 - 인프런 아키텍처 2023-2024
🌱 인프런 아키텍처 2023-2024 - 이동욱님 1년만에 돌아온 인프콘, 그동안 인프런의 아키텍처에는 어떤 변화가 있었을까? 이전 글: 인프콘 2022 - 인프런 아키텍처의 과거와 현재, 그리고 미래 보통 우리가 아키텍처나 구조를 바꿀 때 가장 큰 이유가 장애 해결이나, 트래픽 문제를 해결하기 위해서다. 인프런 역시 장애 해결을 위해 레거시 아키텍처...
인프콘 2022 후기
🌱 갑자기 인프콘 월요일 퇴근 준비중, 주니어 개발자들을 금쪽이라 부르며 살갑게 챙겨주시는 정희님께 DM이 왔다. 헉…?! 당장 정희님께 가고 싶다고 답변을 드렸다. 동욱님이 준비해주신 티켓인 것도 놀라운데, 내 블로그를 보고 계신다니… 😳 예쓰! 그렇게 정희님의 은혜를 받아 인프콘에 참가할 수 있게 되었다. 정희님 다시 한번 정말 감사합니다 🙇♂️...
인프콘 2022 - 어느 날 고민 많은 주니어 개발자가 찾아왔다
🎓 어느 날 고민 많은 주니어 개발자가 찾아왔다 - 김영한님 인프런 영한님 강의 속에서 조금씩 들을 수 있었던 김영한님 성장 일대기와 성장에 관한 팁. 개발자로 취업 준비중이거나, 취업한지 얼마 안된 주니어 개발자들을 타겟으로 준비된 발표같다. 🎓 이직 - 이직 준비, 채용, 이력서, 면접 어떤 회사를 갈 것인가 부터 내가 가고 싶은 회사를 1,2,3...
인프콘 2022 - 레거시 시스템 개편의 기술
👨🍳 레거시 시스템 개편의 기술 - 권용근(킹뽀대)님 우아한형제들 권용근님의 레거시 시스템 개편 꿀팁 모음집. 우아한 멀티 모듈에서 느꼈던 감동을 비슷하게 느낄 수 있는 시간이었다. 도저히 테스트 할 수 없는 환경에서는 어떻게 안정감을 확보했는지까지… 실전형 꿀팁들이 넘쳐 흐른다. 👨🍳 레거시 개편은 왜 일어나는가? 레거시 시스템이란? 낡은 시스템...
인프콘 2022 - 개발자의 셀프 브랜딩
👨💻 개발자의 셀프 브랜딩 개발자의 셀프 브랜딩 - 김민준(벨로퍼트)님 벨로그(개발자들의 블로그 플랫폼)로 유명하신 벨로퍼트님의 개발자 셀프 브랜딩 이야기. 개발자는 나 자신을 어필하는 방법을 알아야하고, 더 나아가 그 방법이 다른 개발자들을 돕는 이로운 방식이면 더욱 좋다는 이야기를 해주셨다. 복잡한 기술 이야기보단 단순 팁들이 많았고, 팁을 이해...
인프콘 2022 - 실전! 멀티 모듈 프로젝트 구조와 설계
🍀 실전! 멀티 모듈 프로젝트 구조와 설계 - 김대성님 무려 18년된 레거시 프로젝트를 현대화적인 프로젝트로 전환하며 느낀 점과, 여러 차례 멀티 모듈 프로젝트 구성하면서 어떻게 하면 유지보수하기 좋은 멀티모듈 프로젝트를 만드는지 비법을 전수해주신다. 🍀 “WHY” 멀티 모듈 프로젝트는 왜 구조가 중요할까? “아키텍쳐는 프로젝트 초기에 이루어져야하는 ...
인프콘 2022 - 코드 리뷰의 또 다른 접근 방법: Pull Requests vs Stacked Changes
🧀 코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes - 치즈(서지연)님 Graphite를 이용한 Stacked Changes 형상관리 방법 소개와, Stacked Changes 가 현업에서 잘 어울리는 이유에 대한 이야기. 🧀 코드 리뷰를 잘 한다는 것? 코드리뷰는 꼭 해야한다. 요즘 개발자들 사이에서 ‘...
인프콘 2022 - 인프런 아키텍처의 과거와 현재, 그리고 미래
🌱 인프런 아키텍처의 과거와 현재, 그리고 미래 - 이동욱님 인프런의 아키텍처가 어떻게 변해왔는지, 그리고 왜 그렇게 변해왔는지에 대한 이야기. 목표를 일정 안에 달성하기 위해 감수해야하는 제약 조건들이 무엇인지, 그런 제약 조건 속 가장 적절한 아키텍처가 무엇인지, 인프런은 어떤 결정을 했는지 하나하나 설명해주셨다. 🌱 시즌1 인프런의 규모가 작고 ...
2022 글또콘 후기
📺 글또콘 신청 무슨 생각이었을까? 개발자로서 개발자들 앞에서 개발 이야기로 발표하고 싶다는 막연한 용기였다. 글또에서 처음으로 진행하는 글또콘에 발표자로 참가를 신청했다. 주제는 이미 블로그 글로 발행했던 테스트 코드. 그리고 첫 글또콘 발표자 중 한명으로 선정되었다. 이미 글로 풀어낸 내용이니 발표자료를 만드는데 크게 어렵지 않을거 같았다. “저희...
나동빈
[Python : 나동빈] 음료수 얼려 먹기
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) N * M 행렬을 입력 받는다. 행렬상의 0은 음료얼음, 1은 플라스틱 0이 이어지면 한 덩어리로 취급한다. 음료얼음 덩어리는 총 몇 개인가? # 입력 예시 4 5 00110 00011 11111 00000 # 출력 예시 3 풀이 DFS로 푸는게 적합해 보였다. 0과 1로 이루어진 ...
[Python : 나동빈] 왕실의 나이트
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 8 * 8 크기의 체스판 좌표를 입력 받으면, 나이트가 움직일 수 있는 경우의 수 구하기 # 체스판 예시 a b c d e f g h 1 - - - - - - - - 2 - - - - - - - - 3 - - - - - - - - 4 - - - - - - - - 5 - - - - -...
[Python : 나동빈] 시각
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중 3이 하나라도 포함되는 모든 경우의 수를 구하라. # 입력 예시 5 # 출력 예시 11475 풀이 1 시간은 3,600초다. 03시, 13시, 23시는 무조건 3,600개의 3을 마주친다. 그 외 시...
[Python : 나동빈] 상하좌우
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) N * N 행렬 좌표 가장 좌측 상단 좌표는 1,1 가장 우측 하단 좌표는 N,N 로 표기한다. N 길이의 입력에는 L(left), R(right), U(up), D(down) 이 들어있다. 좌표를 초과하는 이동은 무시한다. 예를 들어 1,1에서 L,U를 입력 받으면 이동하지 않는다...
[Python : 나동빈] 미로 탈출
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) N * M 행렬 미로 1은 길, 0은 벽 1,1 지점부터 N, M 지점까지 이동하는데 필요한 최저횟수를 구하라. # 입력 예시 5 6 101010 111111 000001 111111 111111 # 출력 예시 10 풀이 BFS에 익숙하지 않아 답안 코드를 많이 참고했다. BFS에는...
[Python : 나동빈] 문자열 재정렬
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 알파벳 대문자와 숫자(0~9)로만 이루어진 문자열이 주어진다. 이 문자열을 알파벳 오름차순으로 정렬하고, 숫자는 모두 더해서 뒤에 붙여라. # 입력 예시 K1KA5CB7 # 출력 예시 ABCKK13 풀이 파이썬 sorted 함수는 숫자와 문자가 섞여있는 리스트에서 숫자를 앞쪽으로, ...
[Python : 나동빈] 모험가 길드
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 한 마을에 모험가가 N명 모험가별로 가지고 있는 ‘공포도’가 다르다. 공포도가 X인 모험가는 반드시 X명 이상으로 구성한 모험가 그룹에 참여 최대 몇 그룹이 탄생하는가 # 입력 예시 5 2 3 1 2 2 # 출력 예시 2 풀이 문제 지문이 애매해서 예시를 보고서야 이해했던 문제 “최...
[Python : 나동빈] 곱하기 혹은 더하기
문제 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저) 각 자리가 숫자(0부터 9)로만 이루어진 문자열 S가 주어졌을 때, 왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며 숫자 사이에 ‘*’ 혹은 ‘+’ 연산자를 넣어 결과적으로 만들어질 수 있는 가장 큰 수를 구하는 프로그램을 작성하세요. 단, +보다 X를 먼저 계산하는 일반적인 방식과...
jpa
왜 조회 쿼리에서 데드락이 발생했을까?
“아니, 도대체 왜 조회 쿼리 메서드에서 데드락이 생기는거야?” 사내 시스템을 운영하던 중 처음보는 유형의 데드락이 발생하여 원인을 탐색하고, 이모저모 실험을 해본 후 남기는 트러블 슈팅 글. 실험은 항상 배우는게 많고 즐겁다. 🔒 콘텐츠 동기화 중 데드락 발생! 사내에는 수시로 비디오 콘텐츠를 동기화하는 로직이 존재한다. 대량의 콘텐츠들이 불특정 시...
Kotlin JPA 필수 지식
Kotlin 은 Java 와 같은 JVM 기반 언어로, JPA 도 사용할 수 있다. Java 와 호환을 우선시하고, Java 에서 번거로웠던 코드를 묵시적으로 제공하거나 제거하는데 초점을 맞춰져있다. 때문에 Kotlin 으로 JPA Entity 를 구성했을 때 깔끔함에 감탄하곤 한다. 그러나 보이지 않는 내부에서는 Kotlin 과 JPA 와의 궁합을 ...
JPA Envers 에러 트러블슈팅
💿 문제 상황 반차를 내고 선인상가 타건샵을 방문했던 금요일 오후, 슬랙 모니터링 채널에 HTTP 500대 에러 알림이 울렸다. ‘어? /education/gov/applicants? 내 도메인인데…’ 황급히 타건을 마무리 짓고 1층 카페로 내려가 노트북을 열었다. 직접적인 에러로그를 확인해보니 아래와 같은 SQL 관련 로그를 볼 수 있었다. Batc...
JPA Enum Table ID 전략 선택
간혹 레거시 코드, DB 테이블 중에 Enum 값을 테이블로 직접 만들어서 관리하는 경우가 있다. 이러한 Enum을 가진 엔티티를 통합 테스트하고자 할 때, Enum 엔티티의 id 값이 발목을 붙잡는 경우가 있었다. id 값이 깔끔하게 1, 4, 3 등으로 선택 되어야 Enum 값 활용이 가능한데, AUTO_INCREMENT 옵션에 의해서 유효하지 않...
@ManyToOne을 사용할 때 @JoinColumn 생략
💡 summary JPA를 학습하면서 @ManyToOne 어노테이션을 통해 다대일 연관관계를 매핑할 때 @JoinColumn을 항시 같이 사용했다. @Entity public class School { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Str...
@NotNull vs @Column(nullable = false)
앞서 읽으면 좋은 글 - @NotNull 어노테이션 예외처리 핸들링 📓 summary lombok에서 지원하는 @NonNull 어노테이션을 통해 엔티티의 필드를 검증하던 중, javax.validation.constraints의 @NotNull 어노테이션도 엔티티에 붙여 사용할 수 있음을 알게 되었다. 📓 @NotNull과 @Column(nullabl...
@NotNull 어노테이션 예외처리 핸들링
📓 summary lombok에서 지원하는 @NonNull 어노테이션을 통해 엔티티의 필드를 검증하던 중, @NonNull 어노테이션이 필드에 Null 값이 주입될 경우 NullPointerException이 던져지는 것을 발견했다. 프로젝트의 ControllerAdivce 구조상 RuntimeException을 한꺼번에 처리하고 있었기 때문에, Ru...
kotlin
Kotlin 에서 Validation 이 동작하지 않는 경우
Kotlin 사용 환경에서 @NotBlank, @Size 등과 같은 javax.Validation annotation 을 사용하는 경우 제대로 validation 이 동작하지 않는 경우가 있다. 예시를 통해 문제 상황을 인지하고, 문제 원인과 해결 방법을 알아보자. 🧾 문제 상황 data class BookEnrollReq( @NotBlank(mess...
Kotlin Scope function 올바르게 사용하기
let, also 와 같은 Scope function 을 오래전부터 사용해왔지만 정확히 어떤 상황에 어떤 Scope function 을 사용하면 좋을지 감이 잘 안잡혔다. 그러다 최근 Scope function 관련 질문도 받았었겠다, 각각의 Scope function 들에 대해 공부하고 어떤 상황에서 사용하면 좋을지 정리해보았다. 🔭 Scope fu...
Java 개발자가 보면 좋을 Kotlin 팁 모음
NEXTSTEP TDD, 클린 코드 with Kotlin 강의를 통해 Kotlin 공부를 진행하면서 정리해둔 팁과 생각을 모아보았다. Kotlin tour 사이트를 함께 활용하면 눈으로 보는 것보다 학습 효과가 더욱 뛰어나겠다. 2024-03-03 Kotlin tour 사이트 링크 추가 (thanks to 웨지) 2022-10-18 range, asS...
Kotlin JPA 필수 지식
Kotlin 은 Java 와 같은 JVM 기반 언어로, JPA 도 사용할 수 있다. Java 와 호환을 우선시하고, Java 에서 번거로웠던 코드를 묵시적으로 제공하거나 제거하는데 초점을 맞춰져있다. 때문에 Kotlin 으로 JPA Entity 를 구성했을 때 깔끔함에 감탄하곤 한다. 그러나 보이지 않는 내부에서는 Kotlin 과 JPA 와의 궁합을 ...
검색 기능 트러블 슈팅기 - QueryDSL Cast
이전 글: 검색 기능 트러블 슈팅기 - 동등성 비교 🔍 트러블 발생 앞서 동등성 비교 문제를 해결하고, 성공적으로 배포까지 완료했다. 매칭 매니저분들께서 활용하실 어드민 페이지에 API를 연결하고 동작 결과를 확인하려 하는데… 화면에 스피너가 한참을 돌았다. 약 6~7초가 지나서야 검색 결과를 조회할 수 있었다. 페이지 로딩이 3초 이상 걸리면 이용자...
검색 기능 트러블 슈팅기 - 동등성 비교
🔍 트러블 발생 시터와 부모 간 매칭을 전담하시는 매칭 매니저분들이 새롭게 사용하실 어드민 페이지 오픈을 앞두고 있다. 어드민 페이지에서 날짜, 신청 상태, 담당 매니저라는 3가지 조건으로 원하는 결과를 빨리 찾으실 수 있도록 검색 기능을 구현 중이다. 검색 기능 구현을 위해서 QueryDSL 사용을 고려했는데, 검색 조건으로 사용되는 데이터들이 엔티...
Kotlin koans 시작하기
이게 그 유명한 코틀린! Kotlin 학습 방법을 고민하던차, Kotlin 공식문서에서 발견한 EduTools 플러그인. 실패하는 단위 테스트를 하나씩 통과시키는 것으로 ‘빠르게 코틀린 문법을 학습할 수 있는 방법이겠다.’ 싶어서 설치해보았다. 🚀 설치 방법 IntelliJ - Preferences - Plugins 메뉴로 이동 후 “EduTools”...
SWEA
[Python : SWEA 3752] 가능한 시험 점수
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWHPkqBqAEsDFAUn&categoryId=AWHPkqBqAEsDFAUn&categoryType=CODE 풀이 문제를 맞추는 개수부터 생각하면 접근 할 수 있다. 문제별 점수부터 생각하면 ...
[Python : SWEA 1984] 중간 평균값 구하기
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pw_-KAdcDFAUq&categoryId=AV5Pw_-KAdcDFAUq&categoryType=CODE 풀이 최대값, 최소값 소거를 위해 오름차순 정렬 최좌측(최소값)과 최우측(최대값)을...
[Python : SWEA 10805] 야바위
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXTC3GH6D-EDFASe&categoryId=AXTC3GH6D-EDFASe&categoryType=CODE 풀이 현재 풀이에 실패한 상태다. 나중에 여유가 생기면 다시 도전해보자. 초기 접근...
[Python : SWEA 10804] 문자열의 거울상
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXTC0x16D8EDFASe 풀이 입력 받은 문자열을 뒤집는다. 뒤집힌 문자열에서 b <–> d, p <–> q 변환을 진행한다. T = int(input()) for test_case ...
[Python : SWEA 10505] 소득 불균형
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXNP4CvauaMDFAXS&categoryId=AXNP4CvauaMDFAXS&categoryType=CODE 풀이 비교하면서 카운팅을 진행하고, 카운팅 된 결과를 출력하면 된다. T = int...
[Python : SWEA 10200] 구독자 전쟁
문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXMCXV_qVgkDFAWv&categoryId=AXMCXV_qVgkDFAWv&categoryType=CODE 풀이 최초 풀이 최초에 경우 수를 잘못 나눴다. 최대값이 무조건 min(A,B)인 ...
docker
Mac M1 no matching manifest 에러 해결
💻 에러 발견 Mac M1 환경에서 미리 작성된 docker-compose.yml 파일을 실행시켰을 때 아래와 같은 에러를 마주할 수 있었다. $docker-compose up -d [+] Running 0/4 ⠦ ... Pulling ⠦ ... Pulling ⠦ ... Pulling ⠏ ... Pulling ... layer no matching m...
도커 위의 DBMS를 로컬로 마이그레이션 하기
이전에 로컬에서 잘 돌아가고 있는 데이터베이스를 굳이 도커 위로 마이그레이션 시킨 경험이 있었다. 그 후로 큰 이슈 없이 서비스가 잘 동작했기 때문에 도커 위에 데이터베이스를 운영하는 것에 만족하고 있었는데, 얼마전 브라운이 초청해주신 홍정민 DBA님의 특별 강연에서 DBA님이 도커 위에 데이터베이스를 운영하는 것에 대해 부정적인 말씀을 하셔서, 질문...
도커 위에 데이터베이스를 운영하지 않는 이유
🎯 도커 위에 데이터베이스를 운영하지 않는 이유가 무엇인가요? 이전에 로컬에서 잘 돌아가고 있는 데이터베이스를 굳이 도커 위로 마이그레이션 시킨 경험이 있었다. 그 후로 큰 이슈 없이 서비스가 잘 동작했기 때문에 도커 위에 데이터베이스를 운영하는 것에 만족하고 있었는데, 얼마전 브라운이 초청해주신 홍정민 DBA님의 특별 강연에서 DBA님이 도커 위에 ...
도커, 스프링부트 타임 존 설정
⏱️ 도커 컨테이너 타임 존 설정 도커 컨테이너 위에서 동작하면서 별도의 타임 존 설정이 없는 프로그램들의 경우 docker-compose.yml 파일의 타임 존 설정에 따라 시간이 설정된다. # cat docker-compose.yml # 버전 정의 (yml 버전) version: '3.7' # service 정의 # docker-compose로 생...
도커 컨테이너 IP 주소 트러블 슈팅
🐋 첫 번째 이슈 - Summary babble 프로젝트를 진행하면서, 상용 서버에서 릴리즈 테스트를 진행하지 말고 별도의 테스팅 서버를 만들어서 릴리즈 테스트를 진행하고자 했다. 상용 서버와 온전히 같은 환경을 갖추기 위해 EC2 인스턴스를 추가로 3~4개 개설하면서 테스팅 서버를 개설할까 고민해봤지만, 도커를 사용해서 각 계층을 독립시키면 EC2 ...
로컬 DB 도커로 마이그레이션 하기
🐳 summary “영속성을 가져야할 클라이언 데이터를 도커 위에서 관리한다고?” 라는 생각 때문에 데이터베이스만큼은 절대로 도커 위에 올려선 안되고, EC2 인스턴스 로컬에 설치해서 관리해야한다는 일종의 신념을 가지고 있었다. 그런데 얼마 전 다라쓰 팀이 디비를 도커 위에 올린 것을 보고 ‘왜 저런 선택을 했을까?’ 생각하면서 도커 위의 데이터베이스...
git
GitHub 파일 끝에 개행이 필요한 이유 (no newline at a end of file)
GitHub 에 Pull Request 를 올리면 가끔 아래와 같은 금지 마크를 발견할 때가 있다. no newline at a end of file line number 를 보면 알 수 있듯, 파일 가장 끝에 개행이 포함되지 않았을 때 발생하는 오류 표기다. 실제로 프로그램을 실행시킬 땐 아무런 문제가 되지 않는데, 왜 GitHub 에서는 이런 오류...
Git rebase merge 트러블 슈팅
babble 팀에선 프로젝트 초기 단계에서 아래와 같은 Git branch merge 전략을 사용하고 있었다. 기존 babble 팀에서 사용하던 Merge 전략 신규 기능 개발시 Develop를 기준으로 새로운 브랜치를 생성하고 작업을 진행한다. 개발이 완료되었을 때 작업된 커밋 내용들을 Squarsh Merge를 이용해서 병합한다. Squarsh M...
Github Personal Access Token 토큰 발급, 키체인 설정
작업 내용을 커밋 후 원본 저장소로 푸시하려 하니 아래와 같은 에러를 마주했다. $ git push origin main remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. remote: P...
Github 비밀번호 변경 후 로컬 깃에 반영하기
🗝️ 비밀번호를 변경하게 된 계기 일주일 전부터 깃허브 메인화면 상단에 이상한 알림이 보이기 시작했다. 관심을 잘 갖지 않고 있다가 지하철에서 한 번 열어봤는데, 얼레? 😲 Javable 블로그 에 댓글을 몇 번 달은적은 있지만 최근에 저런 댓글을 달은 적은 없었다. 나는 “깨지지 않은 링크 첨부합니다.” 이런 화법을 사용하지도 않는다. 도대체 무슨 ...
깃 브랜치 전략
(당시 제이슨의 심정 추측) 우아한테크코스가 시작되었던 첫주차 주말, Racing Car 미션 저장소의 브랜치들이 모두 사라지는 사고가 발생했었다. 크루원들의 브랜치명이 잘못되었다는 것을 알아차리고 재빠르게 브랜치들을 복구한 제이슨. 그리고 그 과정을 지켜보던 웨지가 “어떤 브랜치를 사용하건 커밋은 커밋인데 왜 브랜치 나누기를 중요시하지?” 라는 의문...
깃 명령어 정리
함께 제이슨 팀에 속해있는 매력덩어리 와일더 가 깃 명령어에 대해 공부하고 이를 정리하여 테코톡 형식으로 발표를 진행했었다. 와일더의 발표를 들으면서 새롭게 배운 명령어들이 많아 기억속에서 잊혀지기 전에 정리해보고자 한다! 브랜치(branch) 브랜치가 뭔지는 안다. 그런데 누군가 “브랜치가 뭔가요?” 라고 물으면 무어라 답해야할지 난감하다. 와일더에...
Agile Java
[Agile Java] Lesson05 인터페이스와 폴리모피즘
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system Collections & Comparable CourseReport 클래스에는 아래와 같은 sessions 리스트가 정의되어 있다. public class CourseReport { private final List<Co...
[Agile Java] Lesson04 클래스 메서드와 필드
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system 메서드는 한 가지 일만 하도록 해야한다 “객체의 상태를 바꾸거나 정보를 반환하는 것 중 한가지만을 하도록 메서드를 디자인 해야 한다.” 즉 필드를 바꾸는 동작(setter)을 수행하면 그것만 하고, 필드를 반환하는 동작(getter)...
[Agile Java] Lesson03 문자열과 패키지
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system 문자열은 생성자를 사용하지 마라 이유 1. 생성자 매개변수로 넘겨진 문자열과, 생성된 객체의 기능이 완전히 동일하다. Java 관련 어시스트 기능을 제공하는 IDE에서는 생성자를 사용하면 부적절(불필요)하다는 알림이 뜰 정도다. 이유...
[Agile Java] Lesson02 자바의 기초
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system 클래스 필드는 추상화로부터 클래스가 가질 필드는 추상화를 통해 불필요한 특징을 배제하고 프로그램에 필요한 핵심 특징들만 추려내는 것이 중요하다. 객체지향은 동작을 모델화 하는 것이다! 그러나… 객체지향은 동작을 모델화하는 것이기 때문...
[Agile Java] An Agile Overview
실습 내용 저장소: https://github.com/Hyeon9mak/student-information-system 소프트웨어를 만들 때 항상 따라야 하는 절차 분석 : 소프트웨어가 어때야 하는지 요구사항을 모으고 교정해서 만듦새 결정 계획 : 개발이 얼마나 오래 걸릴지 판단 디자인 : 만든 것을 어떻게 합할지 결정 코딩 : 개발 테스트 : 동작 ...
Python 재무제표 크롤링
[Python 재무제표 크롤링 #5] txt to tsv 자동화
OpenDART에서 제공해준 API들을 추가적으로 조사해보다가, 굳이 기업별로 재무정보를 확인할 필요 없이 상장되어 있는 전체 기업들의 재무정보를 한꺼번에 확인할 수 있는 txt파일의 다운로드를 제공한다는 것을 확인했다. 얼마전 차장님께서 진행해주신 ERP 관련 교육 때, ERP 내부 데이터베이스에 기업들의 재무정보를 기입해두면 재무팀쪽에서 매번 번거...
[Python 재무제표 크롤링 #4] 뒤집힌 프로젝트
2020년 1월 22일 기준 전자공시사이트(dart.fss.or.kr)에서 신규API사이트 오픈을 공개했다. 그간 개발해온 프로젝트와 동일한 목적을 이루는 API 또한 존재하는 걸 확인했고, 이를 테스트 해본 결과 더 양질의 결과물을 얻을 수 있는 것을 확인했다. 그렇다. 위의 말을 정리하자면 그간 진행해온 사항들이 물거품이 된 것이다! 이 때문에 갈...
[Python 재무제표 크롤링 #3] 분기점 세분화 및 예외처리 시작
저번 포스팅까지 작성된 코드에서는 연결 재무상태표에 대한 정보만을 다루었다. 이번에는 (개별) 재무상태표의 정보까지 다루기 위해 연결 재무제표와 (개별) 재무제표를 구별할 수 있는 분기점을 설계 및 보완하고, 기업별로 들쭉날쭉한 사업보고서 양식을 커버할 수 있는 방법에 대해 고안해보았다. 기업별로 서로 다른 사업보고서 양식에 대해서는 사실상 모든 경우...
[Python 재무제표 크롤링 #2] 설계 및 구현 고도화
이번 글에서는 [Python 재무제표 크롤링 #1] 요구사항, 재무제표 분석 및 설계에서 작성했던 코드를 다듬고, 실행 결과 파일 저장명을 기업명(또는 기업종목코드)와 해당 보고서명의 조합으로 저장하기 위한 코드를 추가했다. 또한 재무상태표의 표만을 엑셀에 저장하는 것이 아닌, 재무상태표의 속성정보(기재 날짜, 단위 등)를 표현할 수 있는 방법에 대해...
[Python 재무제표 크롤링 #1] 요구사항, 재무제표 분석 및 설계
방학기간 동안 인턴활동을 하면서 DART 전자공시시스템에서 제공하는 연결재무상태표와 (개별)재무상태표를 크롤링하는 프로젝트를 진행하게 되었다. 프로젝트를 공식적으로 시작한 날짜는 1월 3일이었으나, 중간에 다른 업무들이 겹쳐서 실질적으로 시작한 날짜는 1월 10일 정도였다. 코드가 추가 및 수정된 부분이 꽤 되었으나, 그걸 기록해두지 않았어서 (-_-...
etc
Github default branch 가 main으로 나온다.
2020년 11월 개설한 Agile Java 실습 Repository에 처음 push를 진행할 때였다. ~/student-information-system% git push origin master error: src refspec master does not match any. error: failed to push some refs to 'http...
MacBook Pro (15-inch, 2017) 키보드 교체 후기
💻 학부 내내 함께 해준 맥북 맥북을 최초로 구매한 것이 2018년 1월이었으니, 벌써 만 3년이 다 되었다. 구매 2년 전부터 계획을 세운 뒤 아끼고 아껴서 구매한 소중한 맥북… 큰 문제 없이 학부 2~4학년을 모두 함께 해주었다. 2학년까진 맥북이라 불편한 점이 많았지만, 3학년부터 본격적으로 리눅스 활용을 시작하면서 맥북이라 편한 점이 더 많았던...
하루가 더 길었으면 좋겠다.
머리도 식힐 겸 요즘 하는 생각에 대해 기록해둘까 하는 마음에 쓴다. 사실 당시의 감정을 기록하는 글은 매번 적고 싶었지만, 항상 시간에 쫒겨왔고, 여유시간이 생기는 날에는 자느라 바빴다. 복학 후에 항상 그랬지만, 근래 들어 더 심각하게 느끼는게 있다. 하루가 너무 짧다. 좋게 말하면 시간이 빨리가고, 나쁘게 말하면 준비할게 너무 많다. 나름 치열하...
개발 가이드 탐색의 중요성과 업무효율
거의 3개월만의 포스팅, 근황부터 기록해야할 것 같다. 근황 3월부터 국가근로장학생에 선발되어 네이버 블로그 포스팅을 하는 아르바이트를 진행 중이었다. 워낙 평소에도 글 쓰는 것 좋아했고, 그간 해오던 몸 쓰는 아르바이트에 비하면 이만한 꿀도 없는지라 즐거운 마음으로 돈 벌며 전공수업과 졸업작품을 겸하고 있었는데, 한 달이 되던 차에 매니저님께서 아르...
마크다운과 HTML
마크다운(MarkDown)이라는 이름이 HTML(Hyper Text Markup Language)과 같은 마크업 언어의 종류인데 말장난스럽게 지은 이름이라는 것까지는 알고 있었다. 이러한 특성 때문에 마크다운 문법으로 문서를 작성하면 HTML로 자동 변환되어 글이 적힌다는 것 까지. 그런데 실제 HTML로 어떻게 변환되는지 까지는 아무런 관심이 없었다...
network
web-socket 연결 끊김 감지하기
🐧 Summary 클라이언트A가 서버와 소켓 연결을 끊을 경우(Disconnect) 서버에 해당 소식을 전달하고, 소식을 접한 서버가 나머지 클라이언트들에게 클라이언트A의 연결이 끊겼음을(퇴장했음을) 알리는 형태를 구성하고 싶었다. 사용자가 Disconnect 버튼을 직접 눌러서 서버와 소켓 연결을 끊을 경우엔 연결이 끊기기 직전 서버 쪽으로 알림 요...
spring web-socket 기본 구성
🍦 Configuration @Configuration 어노테이션을 사용 중인 클래스에 @EnableWebSocketMessageBroker 어노테이션을 추가하여 사용 할 수 있다. 어노테이션이 추가되고 나면 web-socket을 이용한 메세지 브로커가 활성화 된다. @Configuration @EnableWebSocketMessageBroker pu...
소켓 기본 개념
📢 Network IPC: Socket pipe, FIFO, message queue, semaphore, shared memory 등은 하나의 컴퓨터, 단말 내부의 프로세스간 통신(Inter Process Communication) 방법이다. socket는 서로 다른 컴퓨터, 단말의 프로세스 간 통신을 지원하는 방법 중 하나다. 통신의 종점을 추상화...
CloudFront를 통해 S3 액세스 하기
☁️ Summary Amazon S3(Simple Storage Service)는 간편한 데이터 관리 및 액세스 제어를 제공해주는 저장소다. ‘무한대로 늘어나는 외부 저장소 + 간편한 액세스 제어’ 정도로 생각하면 편할 것 같다. Amazon CloudFront .html, .css, .js 및 이미지 파일과 같은 정적 및 동적 웹 콘텐츠를 사용자에게...
private IP 만으론 인터넷 연결이 불가능한가?
AWS EC2 인스턴스 4개를 이용해 서비스 인프라를 구축하려 할 때, 팀원 루트가 “WAS랑 DB한테 public IP를 할당할 필요가 있어?” 라는 이야기를 꺼냈다. 어차피 클라이언트와 통신을 주고 받아야하는 Web Server(Reverse Proxy)와 우리가 직접 접속해야 할 Bastion은 public IP가 필수로 필요하지만, 그 외에 같...
aws
Github actions를 이용한 ECS 배포 자동화
이미 ECS상에 배포환경(클러스터, 서비스, 태스크 정의)이 모두 준비된 상태에서, 애플리케이션의 변화가 일어났을 때 Github actions를 이용해 자동으로 배포를 진행하는(태스크 내부 애플리케이션 컨테이너를 교체하는) 자동화 방법을 경험해보았다. 🥚 ECS 수동 배포 자동화 과정에 대한 더 높은 이해를 위해 ECS 수동 배포를 먼저 진행해보았다...
EC2 내부 파일 SCP로 다운로드 받기
🗄️ summary 우아한테크코스 활동기간이 끝나가니 babble 프로젝트 서버에도 비상이 걸렸다. CU께서 수료일을 기점으로 모든 EC2 인스턴스를 삭제할 것이라 공지하셨기 때문이다. ‘언젠간 해야지’를 반복하며 차일피일 미루다가, 정말 일정이 얼마 남지 않아 황급하게 백업할 파일 목록을 뽑아냈다. ### DB - db - SQL 덤프 파일 백업 -...
CloudFront를 통해 S3 액세스 하기
☁️ Summary Amazon S3(Simple Storage Service)는 간편한 데이터 관리 및 액세스 제어를 제공해주는 저장소다. ‘무한대로 늘어나는 외부 저장소 + 간편한 액세스 제어’ 정도로 생각하면 편할 것 같다. Amazon CloudFront .html, .css, .js 및 이미지 파일과 같은 정적 및 동적 웹 콘텐츠를 사용자에게...
private IP 만으론 인터넷 연결이 불가능한가?
AWS EC2 인스턴스 4개를 이용해 서비스 인프라를 구축하려 할 때, 팀원 루트가 “WAS랑 DB한테 public IP를 할당할 필요가 있어?” 라는 이야기를 꺼냈다. 어차피 클라이언트와 통신을 주고 받아야하는 Web Server(Reverse Proxy)와 우리가 직접 접속해야 할 Bastion은 public IP가 필수로 필요하지만, 그 외에 같...
cloudfront
Invalidations를 이용한 CloudFront 캐싱 컨트롤
👾 summary 3차 데모데이에 맞춰 프론트엔드 쪽에 새로운 요구사항이 등장했다. • AWS로 이전 • 시맨틱 버저닝 추가 • 사용자가 배포된 기준으로 항상 최신 버전을 봐야됨 나는 사용자가 배포된 기준으로 항상 최신 버전을 봐야됨 요구사항을 CloudFront 가 갖고 있는 캐싱 정책을 변경해서, 항시 원본 저장소(S3 버킷)를 참조하라는 것으로 ...
CloudFront 도메인 이름 변경하기 (신규등록)
🍩 summary DNS를 활용하는데 2가지 방법이 있다. Route 53로 DNS를 발급 받아 사용한다. (TLS 인증서 등록 과정이 생략된다.) 외부 DNS를 발급 받은 다음, SSL(TLS) 인증서를 ACM(Amazon Certificate Manager)를 통해 등록해서 사용한다. 1번 방법은 사실 AWS의 울타리 안에서 모든게 이루어지는 방법...
React S3, CloudFront에 배포하기
💎 summary babble 팀 서비스를 배포한 후로 새로고침을 할 때나 초기 페이지를 거치지 않고 URL로 직접 페이지를 이동하는 경우 계속해서 403 FORBIDDEN 에러를 마주쳤다. 왜 그런지 이유를 찾던 중, 얼핏 들었던 “React는 HTML 파일을 하나로만 구성해서 개발한다.”가 떠올라서 React SPA에 대해 알아봤다. React는 ...
CloudFront를 통해 S3 액세스 하기
☁️ Summary Amazon S3(Simple Storage Service)는 간편한 데이터 관리 및 액세스 제어를 제공해주는 저장소다. ‘무한대로 늘어나는 외부 저장소 + 간편한 액세스 제어’ 정도로 생각하면 편할 것 같다. Amazon CloudFront .html, .css, .js 및 이미지 파일과 같은 정적 및 동적 웹 콘텐츠를 사용자에게...
database
MySQL(MariaDB) Replication with JPA
🕵️ summary 개요 복제(Replication)는 한 서버에서 다른 서버로 데이터가 동기화 되는 것을 말하며, 원본 데이터를 가진 서버를 소스(Source/Master) 서버, 복제된 데이터를 가지는 서버를 레플리카(Replica/Slave) 서버라고 부른다. 소스 서버에서 데이터 및 스키마에 대한 변경이 최초로 발생하며, 레플리카 서버에서는 이...
도커 위의 DBMS를 로컬로 마이그레이션 하기
이전에 로컬에서 잘 돌아가고 있는 데이터베이스를 굳이 도커 위로 마이그레이션 시킨 경험이 있었다. 그 후로 큰 이슈 없이 서비스가 잘 동작했기 때문에 도커 위에 데이터베이스를 운영하는 것에 만족하고 있었는데, 얼마전 브라운이 초청해주신 홍정민 DBA님의 특별 강연에서 DBA님이 도커 위에 데이터베이스를 운영하는 것에 대해 부정적인 말씀을 하셔서, 질문...
도커 위에 데이터베이스를 운영하지 않는 이유
🎯 도커 위에 데이터베이스를 운영하지 않는 이유가 무엇인가요? 이전에 로컬에서 잘 돌아가고 있는 데이터베이스를 굳이 도커 위로 마이그레이션 시킨 경험이 있었다. 그 후로 큰 이슈 없이 서비스가 잘 동작했기 때문에 도커 위에 데이터베이스를 운영하는 것에 만족하고 있었는데, 얼마전 브라운이 초청해주신 홍정민 DBA님의 특별 강연에서 DBA님이 도커 위에 ...
로컬 DB 도커로 마이그레이션 하기
🐳 summary “영속성을 가져야할 클라이언 데이터를 도커 위에서 관리한다고?” 라는 생각 때문에 데이터베이스만큼은 절대로 도커 위에 올려선 안되고, EC2 인스턴스 로컬에 설치해서 관리해야한다는 일종의 신념을 가지고 있었다. 그런데 얼마 전 다라쓰 팀이 디비를 도커 위에 올린 것을 보고 ‘왜 저런 선택을 했을까?’ 생각하면서 도커 위의 데이터베이스...
java
Java 개발자가 보면 좋을 Kotlin 팁 모음
NEXTSTEP TDD, 클린 코드 with Kotlin 강의를 통해 Kotlin 공부를 진행하면서 정리해둔 팁과 생각을 모아보았다. Kotlin tour 사이트를 함께 활용하면 눈으로 보는 것보다 학습 효과가 더욱 뛰어나겠다. 2024-03-03 Kotlin tour 사이트 링크 추가 (thanks to 웨지) 2022-10-18 range, asS...
Period.between 트러블 슈팅
🍼 문제 상황 매칭 프로세스를 개선한지 얼마 되지 않아 운영팀에서 비상연락이 왔다. (어찌나 당황하셨었는지 지금 읽어봐도 뭐가 문젠지 모르겠다 😂) 정리해보자면 ‘돌봄상세’라는 페이지에서 보이는 아이의 나이는 정상이지만, 시터에게 전달되는 ‘돌봄제안’ 페이지 속 아이의 나이가 이상하다는 내용이었다. 의심되는 상황은 크게 2가지 뿐… 서버에서 값을 이상...
자바 문자열 연결 (StringBuilder, StringBuffer, StringJoiner)
문자열 중간에 REGEX를 이용해서 문자열들을 이어줘야하는 경우가 있다. 보통 String.join이나 StringBuilder를 많이 사용해왔는데, StringJoiner를 통해서도 문자열을 이을 수 있었다. String.join String.join을 사용하는 경우는 대게 문자열이 이미 파싱되어 있는 경우 사용하게 된다. 즉, 이미 준비된 상태에서...
에러 메세지를 상세하게 던져야 하는 이유
에러 메세지를 굉장히 자세하게 적을 필요가 없다고 생각했다. 자칫 잘못 적으면 사용자에게 내부 구조를 노출 시킬 수도 있을거 같고, 굳이 단서를 제공해주지 않아도 에러의 네임만으로도 충분히 문제를 찾을 수 있을 것이라 생각했다. 그런데 이번 팀프로젝트를 진행하면서 AWS CloudWatch를 이용해 에러를 로깅했을 때 문제가 보이기 시작했다. 에러 메...
websocket
NGINX 웹 소켓 프록시 설정
🥃 summary Nginx는 버전 1.3부터 WebSocket을 지원하며, WebSocket의 로드 밸런싱 을 수행 할 수 있다. HTTP에서 WebSocket으로 연결 전환시 HTTP의 Upgrade 및 Connection 헤더를 사용한다. WebSocket을 지원할 때 리버스 프록시 서버가 직면하는 몇 가지 문제가 있다. 하나는 WebSock...
web-socket 연결 끊김 감지하기
🐧 Summary 클라이언트A가 서버와 소켓 연결을 끊을 경우(Disconnect) 서버에 해당 소식을 전달하고, 소식을 접한 서버가 나머지 클라이언트들에게 클라이언트A의 연결이 끊겼음을(퇴장했음을) 알리는 형태를 구성하고 싶었다. 사용자가 Disconnect 버튼을 직접 눌러서 서버와 소켓 연결을 끊을 경우엔 연결이 끊기기 직전 서버 쪽으로 알림 요...
spring web-socket 기본 구성
🍦 Configuration @Configuration 어노테이션을 사용 중인 클래스에 @EnableWebSocketMessageBroker 어노테이션을 추가하여 사용 할 수 있다. 어노테이션이 추가되고 나면 web-socket을 이용한 메세지 브로커가 활성화 된다. @Configuration @EnableWebSocketMessageBroker pu...
소켓 기본 개념
📢 Network IPC: Socket pipe, FIFO, message queue, semaphore, shared memory 등은 하나의 컴퓨터, 단말 내부의 프로세스간 통신(Inter Process Communication) 방법이다. socket는 서로 다른 컴퓨터, 단말의 프로세스 간 통신을 지원하는 방법 중 하나다. 통신의 종점을 추상화...
생각
제품을 만드는 사람과 변화를 만드는 사람
뛰어난 기술과 수 없이 많은 서비스가 우리 곁에 놓여진 세상이다. 이제는 누구나 쉽게 제품을 만들 수 있고, 누구나 쉽게 서비스를 이용할 수 있다. 기업은 자신들의 제품을 자랑하고 싶어 하고, 엔지니어들은 자신들의 기술력을 뽐내고 싶어 한다. 그러나 뛰어난 제품, 기술력과 부단한 마케팅에도 불구하고 소수의 선택 받은 기업, 엔지니어를 제외하곤 시장에서...
제어할 수 없는 것에 의존하지 않기
2023년 3월 진행된 우아한테크세미나 테크 리더 3인이 말하는 “개발자 원칙” 중 이동욱님 세션을 듣고나서 정리한 내용. 일정은 지키지만 버그가 많은 것 vs 일정은 못 지키지만 버그가 없는 것 일정은 곧잘 지켜내지만 버그를 많이 만들어내는 개발자와 일정은 못 지키지만 버그가 없는 완벽한 프로그램을 만드는 개발자 중 어떤 개발자가 더 좋은 개발자일까...
부정적인 생각에서 벗어나는 법
🎋 대나무 숲에 자라난 꽃 봉오리 어떤 문제를 해결해야 하는데 막다른 길에 도달한 것 같은 기분이 들 때가 있습니다. 더 깊이 알아봐야 하는데 도무지 여기까진 내가 감당할 수 있는 범위가 아닌 것처럼 느껴지는 순간들이 많네요. gdb 현란하게 쓰는 동료 개발자를 보면 자괴감도 듭니다. 문제가 발생하면 물고 늘어지는 게 훌륭한 개발자의 자질이라던데 ㅠㅠ...
모종삽과 굴삭기
“현구님, 어드민 페이지에 메모 기능 추가하는 거 어려워요?” 몇 달 전 저녁 회식 자리였다. 지글지글 익어가는 삼겹살을 보며 얼을 타던 나에게 사업 담당자님께서 넌지시 질문을 던지셨다. 정신을 차리고 바라본 담당자님의 얼굴엔 ‘그리 어려운 게 아닐 텐데 왜 추가해주지 않느냐’는 표정이 그려져 있었다. 이미 몇 번이고 이유를 설명했었지만, 답답함이 가...
4학년 1학기를 돌아보며
4학년 1학기를 돌아보며 : 국가근로 아르바이트
올해 1학기에 들어설 때 세웠던 계획이 총 5가지 였다. 성공적으로 졸업작품을 진행할 것 코딩테스트 연습 오픽/토스 점수 취득 정보처리기사 자격증 취득 빚지지 않을 만큼 돈벌기 (아르바이트) 8월 22일 기준으로 2.5가지 진행을 완료했다. 소수점이 나온 이유는 정보처리기사 필기를 이제 끝냈기 때문… 앞으로 실기까지 붙어야 3가지를 완성했다고 말할 수...
4학년 1학기를 돌아보며 : 정보처리기사 필기
올해 1학기에 들어설 때 세웠던 계획이 총 5가지 였다. 성공적으로 졸업작품을 진행할 것 코딩테스트 연습 오픽/토스 점수 취득 정보처리기사 자격증 취득 빚지지 않을 만큼 돈벌기 (아르바이트) 8월 22일 기준으로 2.5가지 진행을 완료했다. 소수점이 나온 이유는 정보처리기사 필기를 이제 끝냈기 때문… 앞으로 실기까지 붙어야 3가지를 완성했다고 말할 수...
4학년 1학기를 돌아보며 : 졸업작품 진행
올해 1학기에 들어설 때 세웠던 계획이 총 5가지 였다. 성공적으로 졸업작품을 진행할 것 코딩테스트 연습 오픽/토스 점수 취득 정보처리기사 자격증 취득 빚지지 않을 만큼 돈벌기 (아르바이트) 8월 22일 기준으로 2.5가지 진행을 완료했고 (소수점이 나온 이유는 나중에) 진행하면서 겪었던 해프닝이나 느꼈던 점들에 대해 기록하기 위해 오랜만에 글을 써본...
IDE
IntelliJ 내가 자주 사용하는 단축키 정리
“도도도독” 키보드 소리를 내며 직접 타이핑하는게 프로그래밍의 재미이자 미덕이라고 생각하던 때, 포비와 제이슨이 “텅, 텅” 엔터키 누르는 소리를 내면서 단축키로 엄청난 양의 코드를 쏟아내는 걸 보았다. ‘미덕은 개뿔이…‘ 당장 단축키를 공부하기 시작했고, 어느샌가 나도 “텅 텅” 소리를 내면서 코드를 작성하고 있다. 혹시나 나중에 까먹을라… 미리 기...
IntelliJ Gruvbox 테마 적용하기
🔧 테마 설치하기 IntelliJ 실행 후 Configure-Prefernces 클릭. 좌측에서 Plugins 메뉴 선택 후, “gruvbox” 검색. 다운로드 수와 평점이 가장 좋은 테마를 선택해서 Install 클릭. 설치가 완료되면 자동으로 IntelliJ 테마가 변경된다. 하지만 내가 원하는 Gruvbox는 검은 색인걸? 🤔 🛠️ 테마 버전 선...
IntelliJ Ultimate버전 학생 인증 후 무료 설치
별 의미 없는 개인적인 서론 개인적으로 통합 IDE를 그다지 선호하지 않는다. 무거움 / 자유롭지 못한 커스터마이징 / 활용하지 않는 기능이 많음 등… 개인적으로 VIM을 사용하던 시절부터 Gruvbox테마 광팬이었기 때문에 VSCODE에 Gruvbox테마를 적용해서 사용해왔다. 그런데 Java는 VSCODE로 통합 IDE를 대체하기엔 너무 포기하는게...
exception
@NotNull vs @Column(nullable = false)
앞서 읽으면 좋은 글 - @NotNull 어노테이션 예외처리 핸들링 📓 summary lombok에서 지원하는 @NonNull 어노테이션을 통해 엔티티의 필드를 검증하던 중, javax.validation.constraints의 @NotNull 어노테이션도 엔티티에 붙여 사용할 수 있음을 알게 되었다. 📓 @NotNull과 @Column(nullabl...
@NotNull 어노테이션 예외처리 핸들링
📓 summary lombok에서 지원하는 @NonNull 어노테이션을 통해 엔티티의 필드를 검증하던 중, @NonNull 어노테이션이 필드에 Null 값이 주입될 경우 NullPointerException이 던져지는 것을 발견했다. 프로젝트의 ControllerAdivce 구조상 RuntimeException을 한꺼번에 처리하고 있었기 때문에, Ru...
에러 메세지를 상세하게 던져야 하는 이유
에러 메세지를 굉장히 자세하게 적을 필요가 없다고 생각했다. 자칫 잘못 적으면 사용자에게 내부 구조를 노출 시킬 수도 있을거 같고, 굳이 단서를 제공해주지 않아도 에러의 네임만으로도 충분히 문제를 찾을 수 있을 것이라 생각했다. 그런데 이번 팀프로젝트를 진행하면서 AWS CloudWatch를 이용해 에러를 로깅했을 때 문제가 보이기 시작했다. 에러 메...
github-actions
GitHub Actions 배포 동시성 설정
⏱ 동시성 설정 고민을 시작한 사건 점심을 먹고 난 후 오후 2시 반쯤, 백엔드 프로젝트 저장소의 Pull Request 2개가 1분 차이(30분, 31분)로 Merge 되는 일이 있었다. PR 이 main 브랜치에 Merge 되면 GitHub Actions Runner 가 실행되면서 자동으로 배포를 진행하는데, 2개의 PR이 동시에 Merge 되니 ...
Github actions를 이용한 ECS 배포 자동화
이미 ECS상에 배포환경(클러스터, 서비스, 태스크 정의)이 모두 준비된 상태에서, 애플리케이션의 변화가 일어났을 때 Github actions를 이용해 자동으로 배포를 진행하는(태스크 내부 애플리케이션 컨테이너를 교체하는) 자동화 방법을 경험해보았다. 🥚 ECS 수동 배포 자동화 과정에 대한 더 높은 이해를 위해 ECS 수동 배포를 먼저 진행해보았다...
Github actions self-hosted runner를 EC2에서 동작시키기
🏃 Summary 최초 Github actions를 통해 프로젝트를 빌드하고 WAS EC2 인스턴스에 빌드된 파일을 전송하는 구조를 구상했다. 그러나 프로젝트 제약사항으로 등록되지 않은 외부 IP를 통해 AWS EC2 SSH 접근이 불가능하다가 있었고, Github actions 측에서 제공하는 서버로 빌드/배포 과정을 진행하는 방식으로는 완성된 빌드...
nginx
Nginx vs Apache
우아한테크코스 피케이의 테코톡을 참고해서 정리한 내용이다! 🌲 Nginx란 무엇인가요? 리버스 프록시, 로드밸런스, http 캐시 등 다양한 기술을 제공하는 웹 서버 프로그램이다. 이벤트 기반 구조(Event-Driven-Model)를 가지고 있으며, 현재 아파치 서버와 함께 웹 서버 분야에서 1,2 등을 다투고 있다. 도대체 이벤트 기반 구조란 무엇...
NGINX 다중 서버 upstream 설정
🚂 summary 기존 Web-server (Reverse-proxy) 역할로 사용자와 WAS(Web Application Server)간 통신을 이어주던 NGINX에서 소나큐브 서버도 통신을 지원하도록 설정하고 싶었다. 그림으로 표현하자면 아래와 같다. 🚂 nginx.conf 설정 # nginx.conf events {} http { # ------...
NGINX 웹 소켓 프록시 설정
🥃 summary Nginx는 버전 1.3부터 WebSocket을 지원하며, WebSocket의 로드 밸런싱 을 수행 할 수 있다. HTTP에서 WebSocket으로 연결 전환시 HTTP의 Upgrade 및 Connection 헤더를 사용한다. WebSocket을 지원할 때 리버스 프록시 서버가 직면하는 몇 가지 문제가 있다. 하나는 WebSock...
reading-books
단위 테스트 - 단위 테스트란 무엇인가
‘블라디미르 코리코프’ 저 ‘단위 테스트’ 책을 읽고 정리한 내용 📚 ‘단위 테스트’의 정의 작은 코드 조각(단위)을 검증하고 빠르게 수행하고 격리된 방식으로 처리하는 자동화된 테스트 단위 테스트의 정의에는 많은 뉘앙쓰가 존재한다. 해석의 차이가 생겼고 단위 테스트에 접근하는 방법이 2가지 뚜렷한 견해로 나뉘었다. 이러한 2가지 견해는 각각 고전파(c...
단위 테스트 - 단위 테스트의 목표
‘블라디미르 코리코프’ 저 ‘단위 테스트’ 책을 읽고 정리한 내용 📚 단위 테스트의 목표 단위 테스트에 시간을 투자할 때는 항상 최대한 이득을 얻도록 노력해야 한다. 테스트에 드는 노력을 가능한 줄이고 그에 따르는 이득을 최대화 해야 한다. 무난하게 성장하고 유지보수가 많이 필요하지 않으며 끊임없이 변화하는 고객의 요구에 신속히 대응할 수 있는 프로젝...
reading books / 배민다움
책을 읽기 전에 어느 덧 우아한테크코스 교육과정에 막바지에 다다르고 자기소개서를 준비하는 11월이다. 루터회관으로 향하는 아침, 버스 안에서 ‘내가 지원하고자 하는 기업들에 대해 얼마나 알고 있지?’ 라는 생각이 머릿 속을 스친다. 멍하니 허공을 응시해보지만 시덥지 않은 생각만 떠올라 반성하게 된다. 결국 루터회관에 도착하자마자 부랴부랴 다른 크루의 ...
s3
CloudFront 도메인 이름 변경하기 (신규등록)
🍩 summary DNS를 활용하는데 2가지 방법이 있다. Route 53로 DNS를 발급 받아 사용한다. (TLS 인증서 등록 과정이 생략된다.) 외부 DNS를 발급 받은 다음, SSL(TLS) 인증서를 ACM(Amazon Certificate Manager)를 통해 등록해서 사용한다. 1번 방법은 사실 AWS의 울타리 안에서 모든게 이루어지는 방법...
React S3, CloudFront에 배포하기
💎 summary babble 팀 서비스를 배포한 후로 새로고침을 할 때나 초기 페이지를 거치지 않고 URL로 직접 페이지를 이동하는 경우 계속해서 403 FORBIDDEN 에러를 마주쳤다. 왜 그런지 이유를 찾던 중, 얼핏 들었던 “React는 HTML 파일을 하나로만 구성해서 개발한다.”가 떠올라서 React SPA에 대해 알아봤다. React는 ...
CloudFront를 통해 S3 액세스 하기
☁️ Summary Amazon S3(Simple Storage Service)는 간편한 데이터 관리 및 액세스 제어를 제공해주는 저장소다. ‘무한대로 늘어나는 외부 저장소 + 간편한 액세스 제어’ 정도로 생각하면 편할 것 같다. Amazon CloudFront .html, .css, .js 및 이미지 파일과 같은 정적 및 동적 웹 콘텐츠를 사용자에게...
socket
web-socket 연결 끊김 감지하기
🐧 Summary 클라이언트A가 서버와 소켓 연결을 끊을 경우(Disconnect) 서버에 해당 소식을 전달하고, 소식을 접한 서버가 나머지 클라이언트들에게 클라이언트A의 연결이 끊겼음을(퇴장했음을) 알리는 형태를 구성하고 싶었다. 사용자가 Disconnect 버튼을 직접 눌러서 서버와 소켓 연결을 끊을 경우엔 연결이 끊기기 직전 서버 쪽으로 알림 요...
spring web-socket 기본 구성
🍦 Configuration @Configuration 어노테이션을 사용 중인 클래스에 @EnableWebSocketMessageBroker 어노테이션을 추가하여 사용 할 수 있다. 어노테이션이 추가되고 나면 web-socket을 이용한 메세지 브로커가 활성화 된다. @Configuration @EnableWebSocketMessageBroker pu...
소켓 기본 개념
📢 Network IPC: Socket pipe, FIFO, message queue, semaphore, shared memory 등은 하나의 컴퓨터, 단말 내부의 프로세스간 통신(Inter Process Communication) 방법이다. socket는 서로 다른 컴퓨터, 단말의 프로세스 간 통신을 지원하는 방법 중 하나다. 통신의 종점을 추상화...
troubleshooting
MySQL 중복 데이터 제거 트러블 슈팅
레거시 테이블 쪽에 불필요하게 쌓여있는 데이터를 새로 준비한 테이블 쪽으로 이관한 후 서버에서 500 에러 알림이 오고 있었다. 에러 로그를 살펴보니 1개의 데이터를 조회하는 쿼리가 날아갔는데, 실제 조회되는 데이터가 2개 이상이라 핸들링이 불가능 하다는 것이었다. 현재 로직 상 중복되는 데이터가 만들어질리는 없으니, 레거시 데이터를 이관하는 과정에서...
단순 신청 제약조건에서 LMS 선수, 후수 교육 관계 설계까지
“심화교육은 기본교육을 수강한 교육생만 신청할 수 있어야 해요.” 8월 신규 오픈을 준비중인아이돌봄 플랫폼 시터 심화교육 과정은 아이돌봄 플랫폼 시터 기본교육 과정을 수강해야만 신청할 수 있다는 조건이 달려있다. 이전까지는 각 교육의 신청-수강-수료증 발급까지 모든 단계에서 완전히 격리 되어 있었지만, 처음으로 신청 단계에서 교육끼리의 의존관계가 생겨...
JPA Envers 에러 트러블슈팅
💿 문제 상황 반차를 내고 선인상가 타건샵을 방문했던 금요일 오후, 슬랙 모니터링 채널에 HTTP 500대 에러 알림이 울렸다. ‘어? /education/gov/applicants? 내 도메인인데…’ 황급히 타건을 마무리 짓고 1층 카페로 내려가 노트북을 열었다. 직접적인 에러로그를 확인해보니 아래와 같은 SQL 관련 로그를 볼 수 있었다. Batc...
unit-testing
내가 테스트 코드에 집착하는 이유
라고 썼지만 사실 작업속도가 느린 것에 대한 변명이 아닐까… ㅋㅋㅋ 🧪 고민의 시작 작년 한 해 동안 우아한테크코스에서 정말 많은 테스트 코드를 작성했다. 테스트 코드에 대한 중요성을 거의 주입 받다시피 배웠고, 주변 모든 크루들도 테스트 코드를 작성하고 있으니 자연스럽게 습관으로 만들 수 있었다. 전체 로직이 마음에 안 들면 다 날려버리고 처음부터 ...
단위 테스트 - 단위 테스트란 무엇인가
‘블라디미르 코리코프’ 저 ‘단위 테스트’ 책을 읽고 정리한 내용 📚 ‘단위 테스트’의 정의 작은 코드 조각(단위)을 검증하고 빠르게 수행하고 격리된 방식으로 처리하는 자동화된 테스트 단위 테스트의 정의에는 많은 뉘앙쓰가 존재한다. 해석의 차이가 생겼고 단위 테스트에 접근하는 방법이 2가지 뚜렷한 견해로 나뉘었다. 이러한 2가지 견해는 각각 고전파(c...
단위 테스트 - 단위 테스트의 목표
‘블라디미르 코리코프’ 저 ‘단위 테스트’ 책을 읽고 정리한 내용 📚 단위 테스트의 목표 단위 테스트에 시간을 투자할 때는 항상 최대한 이득을 얻도록 노력해야 한다. 테스트에 드는 노력을 가능한 줄이고 그에 따르는 이득을 최대화 해야 한다. 무난하게 성장하고 유지보수가 많이 필요하지 않으며 끊임없이 변화하는 고객의 요구에 신속히 대응할 수 있는 프로젝...
회고
2023년 회고
학부 신입생 때의 텐션으로 돌아온 2023년이다. 코로나와 함께 여러가지 일들을 엮으면서 처음보는 사람들과 가까워지길 어려워했는데, 올해는 처음보는 사람이나 회사 사람들과도 참 많이 가까워진 것 같다. 코로나가 끝나고 잦아진 술자리에 취기를 빌려 사람들과 웃고 떠든 덕분이리라. 항상 과한 술은 조심해야겠지만, 역시 이만한 매개체도 없는 것 같다. 덕분...
2022년 회고
그래. 2022년은 개발자로써 첫 인생이 시작된 해였다. 어딘가에 소속되고, 임금을 지불 받으며, 시장이 필요로 하는 소프트웨어를 개발한지 어느새 1년이 되어가고 있다. 작년 회고를 작성할 때 ‘우테코 과정이 개발자로서의 삶 체험판이었다고 생각해보면, 앞으로도 썩 나쁘지 않을거 같다.’ 라고 생각했었는데, 조금은 괴리감이 있지만 역시 나쁘지 않았다. ...
2021년 회고
다사다난한 한 해였다. 정신없이 다녔던 학교를 드디어 졸업하고, 프로젝트를 처음부터 끝까지 개발해서 잠시나마 서비스로 운영도 해보고, 생각지도 못한 좋은 회사에 취업했다. 개발자란 무엇인지, 내가 진짜 하고 싶은 일은 무엇인지 고민도 많았고 학부 4년 내내 컴퓨터공학 관련해서 할 수 있는 일들이 무엇인지, 내 취향에 맞는 진로가 어떤 것인지 고민이 많...
AWS
ReverseProxy-WAS-DB 서버 구성하기
AWS-EC2 인스턴스 3개를 이용해서 위 그림과 같은 서버를 구성할 수 있다. 우선 AWS-EC2를 3개 생성한 후 진행된다. Reverse Proxy - docker + nginx Reverse Proxy로 사용하기 위한 EC2 인스턴스에 접속 후 아래 명령어를 통해 도커를 설치한다. $ sudo apt-get update && \ ...
재부팅 없이 EC2 저장장치 볼륨 늘리기
AWS EC2 인스턴스의 저장장치는 EBS(Elastic Block Store)로 구성할 수 있다. EBS는 탄력적 저장장치로 볼륨을 자유롭게 키울 수 있는데, 재부팅 없이 볼륨을 키우는 방법에 대해 실습을 진행했다. ☁️ 1. EC2 관리 페이지에서 볼륨 확인 AWS EC2 관리 메뉴에서 Elastic Block Store - 볼륨 메뉴로 접근해보자...
OOP
원시값 포장과 VO는 서로 같은가?
결론 원시값 포장과 VO는 서로 다르다. 원시값 포장 VO 용도 책임 분리를 위한 원시값 포장 값 표현을 위한 포장 동등성 보장 할수도, 아닐 수도 무조건 보장해야함 불변 불변 일수도, 아닐수도 무조건 불변이어야함 조엘이 쏘아올린 작은 공 조엘이 쏘아올린 작은 공으로 여러 크루들이 원시값 포장과 VO 객체의 차이에 대해 이야기를 나눴다. 대화 내용...
DTO vs VO
3대450(이었던) 킹갓인비의 2월 25일 DTO vs VO 테코톡을 정리해보자! 🏈 결론 DTO : 데이터 전달용 객체 VO : 값 표현용 객체 ???? 그렇다. 결론부터 이야기 해야 이해가 쉽다. 결론을 알았으니 이제부터 DTO와 VO에 대해 천천히 알아보자. 🏈 DTO 란? Data Transfer Object 데이터를 전달하기 위해 사용하는 객...
blog
블로그 이전에 대한 고민
최근 블로그 포스팅이 뜸했다. 블로그 이전에 관해서 고민이 있었기 떄문이었다. Github Pages(Jkelly) 서비스를 이용한 블로그를 운영한지 어느덧 1년이 지났다. 최근 블로그를 운영하면서 겪은 3가지 이슈로 인해 티스토리 블로그로 이전을 고민했었다. 카테고리 변경시 함께 변경되는 URL 카테고리 세분화 (depth) 마크다운 언어의 이미지 ...
블로그 댓글 utterances로 변경하기
💡 utterances에 관심을 가지게 된 계기 얼마전 내 블로그에 처음으로 댓글이 달렸다! 🎉🎉🎉 [Python : 프로그래머스] 가장 큰 수 포스팅인데, 감사하게도 질문 댓글을 달아주셔서 다시 짚어볼 계기가 되었다. 풀이를 댓글로 설명하는 과정에서 Disqus의 마크업 작성방식이 굉장히 불편했는데, 얼마전 알게된 한돌님의 블로그 댓글 기능이 떠올랐...
ec2
EC2 내부 파일 SCP로 다운로드 받기
🗄️ summary 우아한테크코스 활동기간이 끝나가니 babble 프로젝트 서버에도 비상이 걸렸다. CU께서 수료일을 기점으로 모든 EC2 인스턴스를 삭제할 것이라 공지하셨기 때문이다. ‘언젠간 해야지’를 반복하며 차일피일 미루다가, 정말 일정이 얼마 남지 않아 황급하게 백업할 파일 목록을 뽑아냈다. ### DB - db - SQL 덤프 파일 백업 -...
private IP 만으론 인터넷 연결이 불가능한가?
AWS EC2 인스턴스 4개를 이용해 서비스 인프라를 구축하려 할 때, 팀원 루트가 “WAS랑 DB한테 public IP를 할당할 필요가 있어?” 라는 이야기를 꺼냈다. 어차피 클라이언트와 통신을 주고 받아야하는 Web Server(Reverse Proxy)와 우리가 직접 접속해야 할 Bastion은 public IP가 필수로 필요하지만, 그 외에 같...
ip address
도커, 스프링부트 타임 존 설정
⏱️ 도커 컨테이너 타임 존 설정 도커 컨테이너 위에서 동작하면서 별도의 타임 존 설정이 없는 프로그램들의 경우 docker-compose.yml 파일의 타임 존 설정에 따라 시간이 설정된다. # cat docker-compose.yml # 버전 정의 (yml 버전) version: '3.7' # service 정의 # docker-compose로 생...
도커 컨테이너 IP 주소 트러블 슈팅
🐋 첫 번째 이슈 - Summary babble 프로젝트를 진행하면서, 상용 서버에서 릴리즈 테스트를 진행하지 말고 별도의 테스팅 서버를 만들어서 릴리즈 테스트를 진행하고자 했다. 상용 서버와 온전히 같은 환경을 갖추기 위해 EC2 인스턴스를 추가로 3~4개 개설하면서 테스팅 서버를 개설할까 고민해봤지만, 도커를 사용해서 각 계층을 독립시키면 EC2 ...
query-dsl
QueryDSL 하나의 테이블에 2번 조인을 걸고 싶을 땐 어떻게 하는가?
QueryDSL에서 하나의 테이블에 각각 나눠서 2번 조인을 걸고 싶을 때가 있다. 예를 들면 부모(Parent), 시터(Sitter)의 정보를 각각 필요로 하는데 이들이 사용자(User) 테이블 하나로 구성되어 있는 경우다. 이런 경우 Q객체를 2가지 변수로 나누어 할당한 후, 조인을 걸면 된다! References [동일 entity , table...
검색 기능 트러블 슈팅기 - QueryDSL Cast
이전 글: 검색 기능 트러블 슈팅기 - 동등성 비교 🔍 트러블 발생 앞서 동등성 비교 문제를 해결하고, 성공적으로 배포까지 완료했다. 매칭 매니저분들께서 활용하실 어드민 페이지에 API를 연결하고 동작 결과를 확인하려 하는데… 화면에 스피너가 한참을 돌았다. 약 6~7초가 지나서야 검색 결과를 조회할 수 있었다. 페이지 로딩이 3초 이상 걸리면 이용자...
sonarqube
SonarCloud 적용 트러블 슈팅
summary 우아한테크코스 레벨4 HTTP 서버 구현하기 미션을 진행하던 중이었다. 미션대로 구현을 완료하고 PR(Pull Request)를 작성했는데 정적분석 툴 SonarQube 가 자동으로 동작하고, 분석 결과도 PR 페이지에서 곧장 보여주고 있었다?! 자세히보니 SonarQube가 아니라 SonarCloud 였다! SonarQube에서 제공하...
소나큐브 설치하기
이 글에서는 현재 최신버전인 9.0버전이 아니라, LTS버전인 8.9버전을 사용했다! 소나큐브는 프로그래밍 언어에서 버그, 코드 악취, 보안 취약점을 발견할 목적으로 정적 코드 분석으로 자동 리뷰를 수행하기 위한 지속적인 코드 품질 검사용 오픈 소스 플랫폼이다. 중복 코드, 코딩 표준, 유닛 테스트, 코드 커버리지, 코드 복잡도, 주석, 버그 및 보안...
test
내가 테스트 코드에 집착하는 이유
라고 썼지만 사실 작업속도가 느린 것에 대한 변명이 아닐까… ㅋㅋㅋ 🧪 고민의 시작 작년 한 해 동안 우아한테크코스에서 정말 많은 테스트 코드를 작성했다. 테스트 코드에 대한 중요성을 거의 주입 받다시피 배웠고, 주변 모든 크루들도 테스트 코드를 작성하고 있으니 자연스럽게 습관으로 만들 수 있었다. 전체 로직이 마음에 안 들면 다 날려버리고 처음부터 ...
인수 테스트와 E2E 테스트 차이
🪧 summary “인수 테스트랑 E2E 테스트랑 구분하는 기준이 뭘까?” 3대 450(치던) 인비가 갑작스레 인수 테스트와 E2E 테스트의 차이를 궁금해했다. 우아한테크코스 레벨1~2 때도 자주 거론 되었는데, 수료한 상태에서 다시 고민을 해보니 흥미로운 주제였다. 우리는 백엔드를 개발하기 때문에 우리의 클라이언트 대부분은 프론트엔드다. 프론트엔드가...
validation
@NotNull vs @Column(nullable = false)
앞서 읽으면 좋은 글 - @NotNull 어노테이션 예외처리 핸들링 📓 summary lombok에서 지원하는 @NonNull 어노테이션을 통해 엔티티의 필드를 검증하던 중, javax.validation.constraints의 @NotNull 어노테이션도 엔티티에 붙여 사용할 수 있음을 알게 되었다. 📓 @NotNull과 @Column(nullabl...
@NotNull 어노테이션 예외처리 핸들링
📓 summary lombok에서 지원하는 @NonNull 어노테이션을 통해 엔티티의 필드를 검증하던 중, @NonNull 어노테이션이 필드에 Null 값이 주입될 경우 NullPointerException이 던져지는 것을 발견했다. 프로젝트의 ControllerAdivce 구조상 RuntimeException을 한꺼번에 처리하고 있었기 때문에, Ru...
C
열혈C프로그래밍을 복습하면서 배운 것들
# 1학년 과목을 재수강 하고 있다. 새내기 시절 ‘정말 저렇게 살아도 될까?’ 싶을 정도로 학교생활을 즐겨서 전공 과목 점수가 영 순탄하지 못했다. (후회는 없다! 잘 놀았어! 🤤) 그 중에서도 가장 기본이 되는 C프로그래밍 과목 점수들이 모두 C+ + 하나만 더 있으면 C++이 되겠는데? 다행히 복학 후 학업에 관심을 갖게 되면서 학점을 야금야금 ...
EC2
ReverseProxy-WAS-DB 서버 구성하기
AWS-EC2 인스턴스 3개를 이용해서 위 그림과 같은 서버를 구성할 수 있다. 우선 AWS-EC2를 3개 생성한 후 진행된다. Reverse Proxy - docker + nginx Reverse Proxy로 사용하기 위한 EC2 인스턴스에 접속 후 아래 명령어를 통해 도커를 설치한다. $ sudo apt-get update && \ ...
Http상태코드
400 BAD REQUEST vs 404 NOT FOUND
404 NOT FOUND 레벨2 기간 미션을 진행하던 중 크로플이 도저히 이유를 알 수 없는 테스트 에러를 마주쳐서, 도와줄 사람을 찾고 있다며 찾아왔다. 이 때 크로플이 대략 아래와 같은 테스트 코드를 보여줬다. @DisplayName("Bearer Auth 유효하지 않은 토큰") @Test void myInfoWithWrongBearerAuth()...
JPA
MySQL(MariaDB) Replication with JPA
🕵️ summary 개요 복제(Replication)는 한 서버에서 다른 서버로 데이터가 동기화 되는 것을 말하며, 원본 데이터를 가진 서버를 소스(Source/Master) 서버, 복제된 데이터를 가지는 서버를 레플리카(Replica/Slave) 서버라고 부른다. 소스 서버에서 데이터 및 스키마에 대한 변경이 최초로 발생하며, 레플리카 서버에서는 이...
JUnit 5
[JUnit 5] 간단한 개요와 Annotations
현재 JUnit 5 버전을 사용중이므로, 5 버전을 기준으로 정리를 진행했다. JUnit 공식문서 에서 지루한 JUnit의 개요 등을 설명하는데… 그런건 필요할 때 공식 문서를 다시 참고하고, 사용해본 것들에 대해서만 계속 추가하면서 정리하자. main method vs JUnit main method는 우리가 흔하게 잘 알고 있는 그 main met...
JdbcTemplate
SimpleJdbcInsert를 통한 쉬운 Insert
private final JdbcTemplate jdbcTemplate; public StationDao(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void insert(final Station station) { String sql = "INSERT INTO sta...
ReverseProxy
ReverseProxy-WAS-DB 서버 구성하기
AWS-EC2 인스턴스 3개를 이용해서 위 그림과 같은 서버를 구성할 수 있다. 우선 AWS-EC2를 3개 생성한 후 진행된다. Reverse Proxy - docker + nginx Reverse Proxy로 사용하기 위한 EC2 인스턴스에 접속 후 아래 명령어를 통해 도커를 설치한다. $ sudo apt-get update && \ ...
Spring
스프링 어노테이션 정리
2021년 4월 ~ 5월 기간 동안 배운 스프링 어노테이션들에 대해 정리했다. @Configuration @Configuration 어노테이션은 해당 클래스를 스프링 설정 클래스로 지정하는데 사용된다. import org.springframework.context.annotation.Configuration; @Configuration public c...
Spring frameworks
Spring과 Javascript Frameworks 공부
요즘 잘나간다는 프레임워크들의 특징을 알고 싶다. 라는 생각으로 시작하게 된 개인 프로젝트다. 개인적으로 백엔드는 Node.js가 가볍고 배우기도 쉽고, 가장 익숙해서 더 선호하지만 정형화된 패턴과 그로 인한 안정성을 가진 Spring을 두고 클라이언트의 입장에서 비교했을 때, ‘과연 내가 클라이언트라면 안정성과 빠른 개발속도 중에 무엇을 더 선호할까...
VI/VIM
VI/VIM 단축키 정리
시스템프로그래밍, 운영체제를 공부하는 동안 VIM에 푹 빠져서 단축키를 외웠던거 같은데, 인텔리제이의 생산성에 무릎꿇고 말은 나… 그래도 배포/인프라 공부를 하면서 다시 VIM을 사용할 기회가 찾아왔다. 남겨두자! 개인적으로 자주 사용하는 단축키는 오른쪽에 (*) 를 남겼다. ⌨️ 삽입 관련 i - 현재 커서 위치에 Insert 하기 ***** I -...
WAS
ReverseProxy-WAS-DB 서버 구성하기
AWS-EC2 인스턴스 3개를 이용해서 위 그림과 같은 서버를 구성할 수 있다. 우선 AWS-EC2를 3개 생성한 후 진행된다. Reverse Proxy - docker + nginx Reverse Proxy로 사용하기 위한 EC2 인스턴스에 접속 후 아래 명령어를 통해 도커를 설치한다. $ sudo apt-get update && \ ...
apache
Nginx vs Apache
우아한테크코스 피케이의 테코톡을 참고해서 정리한 내용이다! 🌲 Nginx란 무엇인가요? 리버스 프록시, 로드밸런스, http 캐시 등 다양한 기술을 제공하는 웹 서버 프로그램이다. 이벤트 기반 구조(Event-Driven-Model)를 가지고 있으며, 현재 아파치 서버와 함께 웹 서버 분야에서 1,2 등을 다투고 있다. 도대체 이벤트 기반 구조란 무엇...
arm64
Mac M1 no matching manifest 에러 해결
💻 에러 발견 Mac M1 환경에서 미리 작성된 docker-compose.yml 파일을 실행시켰을 때 아래와 같은 에러를 마주할 수 있었다. $docker-compose up -d [+] Running 0/4 ⠦ ... Pulling ⠦ ... Pulling ⠦ ... Pulling ⠏ ... Pulling ... layer no matching m...
cache
Invalidations를 이용한 CloudFront 캐싱 컨트롤
👾 summary 3차 데모데이에 맞춰 프론트엔드 쪽에 새로운 요구사항이 등장했다. • AWS로 이전 • 시맨틱 버저닝 추가 • 사용자가 배포된 기준으로 항상 최신 버전을 봐야됨 나는 사용자가 배포된 기준으로 항상 최신 버전을 봐야됨 요구사항을 CloudFront 가 갖고 있는 캐싱 정책을 변경해서, 항시 원본 저장소(S3 버킷)를 참조하라는 것으로 ...
cicd
Github actions self-hosted runner를 EC2에서 동작시키기
🏃 Summary 최초 Github actions를 통해 프로젝트를 빌드하고 WAS EC2 인스턴스에 빌드된 파일을 전송하는 구조를 구상했다. 그러나 프로젝트 제약사항으로 등록되지 않은 외부 IP를 통해 AWS EC2 SSH 접근이 불가능하다가 있었고, Github actions 측에서 제공하는 서버로 빌드/배포 과정을 진행하는 방식으로는 완성된 빌드...
cloud
Terraform을 이용한 클라우드 인프라 환경 구성
🌕 Terraform 소개 새 AWS 인스턴스를 프로비저닝 하기 위해선 다음을 포함한 몇 가지 기본 정보를 수집해야한다. EC2 인스턴스 이름 운영 체제 (Image) VM 크기 지리적 위치 (Region) 보안 그룹 그 외… 대부분 개발자가 직접 AWS Console(GUI)을 조작하거나 CloudFormation Templates를 통해 프로비저닝...
code-review
한번 듣고 평생 써먹는 코드 리뷰 노하우 정리
OKKY 1월 세미나에서 백명석님의 “한번 듣고 평생 써먹는 코드 리뷰 노하우”를 듣고 정리한 내용 💬 왜 코드 리뷰를 해야 하나? 우리가 살고 있는 시대 “Software is eating the world” 소프트웨어에 의해 운영되는 제품과 서비스들의 영역이 늘어나고 있다. 4차산업 변동성이 매우 심한 시장. 변화의 속도가 점점 더 빨라지고 있고 ...
concurrency
GitHub Actions 배포 동시성 설정
⏱ 동시성 설정 고민을 시작한 사건 점심을 먹고 난 후 오후 2시 반쯤, 백엔드 프로젝트 저장소의 Pull Request 2개가 1분 차이(30분, 31분)로 Merge 되는 일이 있었다. PR 이 main 브랜치에 Merge 되면 GitHub Actions Runner 가 실행되면서 자동으로 배포를 진행하는데, 2개의 PR이 동시에 Merge 되니 ...
cpu-load
CPU Load 와 CPU Utilization 은 어떻게 다른가
💾 문제 상황 어느 날 현태님께서 분석계 DB 상태 알람이 동작하지 않는 걸 체크해달라고 하셨다. CPU의 사용량이 70%를 넘어가면 관리자에게 알림이 오도록 설정해두신 것 같았다. CloudWatch 지표를 살펴보니 CPU Load가 70%를 넘기면 알림이 오도록 셋팅되어 있었다. 그러나 CPU Load는 평균적으로 0~1% 사이를 오갈 뿐이었다. ...
cpu-utilization
CPU Load 와 CPU Utilization 은 어떻게 다른가
💾 문제 상황 어느 날 현태님께서 분석계 DB 상태 알람이 동작하지 않는 걸 체크해달라고 하셨다. CPU의 사용량이 70%를 넘어가면 관리자에게 알림이 오도록 설정해두신 것 같았다. CloudWatch 지표를 살펴보니 CPU Load가 70%를 넘기면 알림이 오도록 셋팅되어 있었다. 그러나 CPU Load는 평균적으로 0~1% 사이를 오갈 뿐이었다. ...
data-class
검색 기능 트러블 슈팅기 - 동등성 비교
🔍 트러블 발생 시터와 부모 간 매칭을 전담하시는 매칭 매니저분들이 새롭게 사용하실 어드민 페이지 오픈을 앞두고 있다. 어드민 페이지에서 날짜, 신청 상태, 담당 매니저라는 3가지 조건으로 원하는 결과를 빨리 찾으실 수 있도록 검색 기능을 구현 중이다. 검색 기능 구현을 위해서 QueryDSL 사용을 고려했는데, 검색 조건으로 사용되는 데이터들이 엔티...
deployment
GitHub Actions 배포 동시성 설정
⏱ 동시성 설정 고민을 시작한 사건 점심을 먹고 난 후 오후 2시 반쯤, 백엔드 프로젝트 저장소의 Pull Request 2개가 1분 차이(30분, 31분)로 Merge 되는 일이 있었다. PR 이 main 브랜치에 Merge 되면 GitHub Actions Runner 가 실행되면서 자동으로 배포를 진행하는데, 2개의 PR이 동시에 Merge 되니 ...
design pattern
MVC 패턴이 지켜지는 5가지 규칙
박재성의 의지를 이어나가고 있는 제리 가 테코톡에서 발표한 “MVC 패턴이 지켜지는 5가지 규칙”을 정리해보자! 🐭 MVC 패턴 맛보기 MVC 패턴이 지켜지는 규칙을 알아보기 전에, MVC 패턴의 구조를 맛보기로 간단하게 살펴보자. 사용자가 View에게 맛집 검색을 요청한다. View가 Controller에게 맛집 검색 요청을 전달한다. Control...
dns
CloudFront 도메인 이름 변경하기 (신규등록)
🍩 summary DNS를 활용하는데 2가지 방법이 있다. Route 53로 DNS를 발급 받아 사용한다. (TLS 인증서 등록 과정이 생략된다.) 외부 DNS를 발급 받은 다음, SSL(TLS) 인증서를 ACM(Amazon Certificate Manager)를 통해 등록해서 사용한다. 1번 방법은 사실 AWS의 울타리 안에서 모든게 이루어지는 방법...
ecs
Github actions를 이용한 ECS 배포 자동화
이미 ECS상에 배포환경(클러스터, 서비스, 태스크 정의)이 모두 준비된 상태에서, 애플리케이션의 변화가 일어났을 때 Github actions를 이용해 자동으로 배포를 진행하는(태스크 내부 애플리케이션 컨테이너를 교체하는) 자동화 방법을 경험해보았다. 🥚 ECS 수동 배포 자동화 과정에 대한 더 높은 이해를 위해 ECS 수동 배포를 먼저 진행해보았다...
envers
JPA Envers 에러 트러블슈팅
💿 문제 상황 반차를 내고 선인상가 타건샵을 방문했던 금요일 오후, 슬랙 모니터링 채널에 HTTP 500대 에러 알림이 울렸다. ‘어? /education/gov/applicants? 내 도메인인데…’ 황급히 타건을 마무리 짓고 1층 카페로 내려가 노트북을 열었다. 직접적인 에러로그를 확인해보니 아래와 같은 SQL 관련 로그를 볼 수 있었다. Batc...
equals
검색 기능 트러블 슈팅기 - 동등성 비교
🔍 트러블 발생 시터와 부모 간 매칭을 전담하시는 매칭 매니저분들이 새롭게 사용하실 어드민 페이지 오픈을 앞두고 있다. 어드민 페이지에서 날짜, 신청 상태, 담당 매니저라는 3가지 조건으로 원하는 결과를 빨리 찾으실 수 있도록 검색 기능을 구현 중이다. 검색 기능 구현을 위해서 QueryDSL 사용을 고려했는데, 검색 조건으로 사용되는 데이터들이 엔티...
feature-toggle
Unleash custom strategy를 이용한 feature toggle 변수 필터 지정
feature toggle & Unleash feature toggle 이란 특정 지점에 분기를 형성하여 각 조건에 해당되는 대상에게 각기 다른 기능을 제공해줄 수 있다. 가령 “2022년 7월 1일부터 3일까지는 A기능을, 7월 4일부터는 B기능을 제공하고 싶다.” 라는 니즈가 있으면 7월 1일부터 3일까지는 feature toggle을 ON...
github
Github Personal Access Token 토큰 발급, 키체인 설정
작업 내용을 커밋 후 원본 저장소로 푸시하려 하니 아래와 같은 에러를 마주했다. $ git push origin main remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. remote: P...
github actions
Github-actions 작업간 독립성
🐹 summary 스프링부트 서버 빌드와 소나큐브 서버 빌드를 하나의 workflow.yml 파일로 관리하던 중, 소나큐브 서버 빌드시 동작하는 jacoco가 스프링부트 서버 빌드에서 진행되는 테스트코드 결과물(부산물)을 필요로 한다는 걸 깨닫고 스프링부트 서버 빌드가 소나큐브 서버 빌드보다 먼저 실행되도록 needs 키워드를 통해 의존성을 부여했다....
구글에서 제안하는 오류 메세지 작성법
Google Developers - Writing Helpful Error Messages 문서에서 발췌한 내용들 입니다. 오류 메세지는 오류가 발생하는 시점에 개발자가 사용자에게 상호작용할 수 있는 수단이다. 잘 작성된 오류 메세지는 사용자에게 해결을 위한 중요한 정보를 전달해주지만, 잘못된 오류 메세지는 오히려 사용자들에게 혼란을 야기한다. 구글은...
gradle
The specified project directory doest not exist 오류 해결
💾 오류 IntelliJ를 통해 멀티 모듈 프로젝트를 관리하면서 새로운 모듈을 생성 후 제거하면, 아래와 같은 아래를 마주친다. The specified project directory {디렉토리 명} doest not exist 💾 원인 및 해결 주로 디렉토리만 제거하고, Gradle에 등록된 모듈 리스트에선 제거(동기화)하지 않아서 발생하는 오류이...
id-strategy
JPA Enum Table ID 전략 선택
간혹 레거시 코드, DB 테이블 중에 Enum 값을 테이블로 직접 만들어서 관리하는 경우가 있다. 이러한 Enum을 가진 엔티티를 통합 테스트하고자 할 때, Enum 엔티티의 id 값이 발목을 붙잡는 경우가 있었다. id 값이 깔끔하게 1, 4, 3 등으로 선택 되어야 Enum 값 활용이 가능한데, AUTO_INCREMENT 옵션에 의해서 유효하지 않...
infra
NGINX 다중 서버 upstream 설정
🚂 summary 기존 Web-server (Reverse-proxy) 역할로 사용자와 WAS(Web Application Server)간 통신을 이어주던 NGINX에서 소나큐브 서버도 통신을 지원하도록 설정하고 싶었다. 그림으로 표현하자면 아래와 같다. 🚂 nginx.conf 설정 # nginx.conf events {} http { # ------...
infrastructure
Terraform을 이용한 클라우드 인프라 환경 구성
🌕 Terraform 소개 새 AWS 인스턴스를 프로비저닝 하기 위해선 다음을 포함한 몇 가지 기본 정보를 수집해야한다. EC2 인스턴스 이름 운영 체제 (Image) VM 크기 지리적 위치 (Region) 보안 그룹 그 외… 대부분 개발자가 직접 AWS Console(GUI)을 조작하거나 CloudFormation Templates를 통해 프로비저닝...
intellij
The specified project directory doest not exist 오류 해결
💾 오류 IntelliJ를 통해 멀티 모듈 프로젝트를 관리하면서 새로운 모듈을 생성 후 제거하면, 아래와 같은 아래를 마주친다. The specified project directory {디렉토리 명} doest not exist 💾 원인 및 해결 주로 디렉토리만 제거하고, Gradle에 등록된 모듈 리스트에선 제거(동기화)하지 않아서 발생하는 오류이...
invalidations
Invalidations를 이용한 CloudFront 캐싱 컨트롤
👾 summary 3차 데모데이에 맞춰 프론트엔드 쪽에 새로운 요구사항이 등장했다. • AWS로 이전 • 시맨틱 버저닝 추가 • 사용자가 배포된 기준으로 항상 최신 버전을 봐야됨 나는 사용자가 배포된 기준으로 항상 최신 버전을 봐야됨 요구사항을 CloudFront 가 갖고 있는 캐싱 정책을 변경해서, 항시 원본 저장소(S3 버킷)를 참조하라는 것으로 ...
jdk
macOS Big Sur JDK 설치 및 버전 변경
🍺 summary 신규 프로젝트를 로컬에서 동작 시켜보기 위해 JDK 8 버전이 필요했다. 기존 로컬에 설치되어 있던 버전은 JDK 14 였기 때문에 버전 변경이 필요했는데 버전 변경이 뜻대로 이루어지지 않아 반나절을 고생했다. 🍺 Homebrew를 이용한 JDK 8 설치 JDK를 직접 다운로드 받아 설치할 경우 어떤 버전을, 어디에 설치했는지 관리가...
lms
단순 신청 제약조건에서 LMS 선수, 후수 교육 관계 설계까지
“심화교육은 기본교육을 수강한 교육생만 신청할 수 있어야 해요.” 8월 신규 오픈을 준비중인아이돌봄 플랫폼 시터 심화교육 과정은 아이돌봄 플랫폼 시터 기본교육 과정을 수강해야만 신청할 수 있다는 조건이 달려있다. 이전까지는 각 교육의 신청-수강-수료증 발급까지 모든 단계에서 완전히 격리 되어 있었지만, 처음으로 신청 단계에서 교육끼리의 의존관계가 생겨...
m1
Mac M1 no matching manifest 에러 해결
💻 에러 발견 Mac M1 환경에서 미리 작성된 docker-compose.yml 파일을 실행시켰을 때 아래와 같은 에러를 마주할 수 있었다. $docker-compose up -d [+] Running 0/4 ⠦ ... Pulling ⠦ ... Pulling ⠦ ... Pulling ⠏ ... Pulling ... layer no matching m...
mysql
MySQL 중복 데이터 제거 트러블 슈팅
레거시 테이블 쪽에 불필요하게 쌓여있는 데이터를 새로 준비한 테이블 쪽으로 이관한 후 서버에서 500 에러 알림이 오고 있었다. 에러 로그를 살펴보니 1개의 데이터를 조회하는 쿼리가 날아갔는데, 실제 조회되는 데이터가 2개 이상이라 핸들링이 불가능 하다는 것이었다. 현재 로직 상 중복되는 데이터가 만들어질리는 없으니, 레거시 데이터를 이관하는 과정에서...
oop
객체지향 프로그래밍에 관한 고찰
얼마전 회사에서 조영호님의 객체지향 프로그래밍 강연이 진행되었다. 그간 ‘객체지향이란 무엇인가’, ‘객체지향 프로그래밍을 왜 해야 하는가?’ 홀로 고민이 많았는데, 조영호님의 강연을 통해 그것들이 헛되거나 틀리지 않았음을 느껴 너무나 행복했다. 조금은 자신감을 갖고 객체지향에 대한 내 생각을 풀어봐도 좋을 것 같아서 글을 남긴다. 💾 안녕 객체지향 2...
period
Period.between 트러블 슈팅
🍼 문제 상황 매칭 프로세스를 개선한지 얼마 되지 않아 운영팀에서 비상연락이 왔다. (어찌나 당황하셨었는지 지금 읽어봐도 뭐가 문젠지 모르겠다 😂) 정리해보자면 ‘돌봄상세’라는 페이지에서 보이는 아이의 나이는 정상이지만, 시터에게 전달되는 ‘돌봄제안’ 페이지 속 아이의 나이가 이상하다는 내용이었다. 의심되는 상황은 크게 2가지 뿐… 서버에서 값을 이상...
programming
구글에서 제안하는 오류 메세지 작성법
Google Developers - Writing Helpful Error Messages 문서에서 발췌한 내용들 입니다. 오류 메세지는 오류가 발생하는 시점에 개발자가 사용자에게 상호작용할 수 있는 수단이다. 잘 작성된 오류 메세지는 사용자에게 해결을 위한 중요한 정보를 전달해주지만, 잘못된 오류 메세지는 오히려 사용자들에게 혼란을 야기한다. 구글은...
react
React S3, CloudFront에 배포하기
💎 summary babble 팀 서비스를 배포한 후로 새로고침을 할 때나 초기 페이지를 거치지 않고 URL로 직접 페이지를 이동하는 경우 계속해서 403 FORBIDDEN 에러를 마주쳤다. 왜 그런지 이유를 찾던 중, 얼핏 들었던 “React는 HTML 파일을 하나로만 구성해서 개발한다.”가 떠올라서 React SPA에 대해 알아봤다. React는 ...
replication
MySQL(MariaDB) Replication with JPA
🕵️ summary 개요 복제(Replication)는 한 서버에서 다른 서버로 데이터가 동기화 되는 것을 말하며, 원본 데이터를 가진 서버를 소스(Source/Master) 서버, 복제된 데이터를 가지는 서버를 레플리카(Replica/Slave) 서버라고 부른다. 소스 서버에서 데이터 및 스키마에 대한 변경이 최초로 발생하며, 레플리카 서버에서는 이...
scp
EC2 내부 파일 SCP로 다운로드 받기
🗄️ summary 우아한테크코스 활동기간이 끝나가니 babble 프로젝트 서버에도 비상이 걸렸다. CU께서 수료일을 기점으로 모든 EC2 인스턴스를 삭제할 것이라 공지하셨기 때문이다. ‘언젠간 해야지’를 반복하며 차일피일 미루다가, 정말 일정이 얼마 남지 않아 황급하게 백업할 파일 목록을 뽑아냈다. ### DB - db - SQL 덤프 파일 백업 -...
session
쿠키와 세션에서 세션은 어디에 저장되는가?
🍪 세션은 어디에 있지? 쿠키와 세션에 대해 공부하다보면, 쿠키가 클라이언트의 브라우저 스토리지(저장공간)에 저장된다는 것을 금방 알 수 있다. 실제로 브라우저의 쿠키 저장공간을 확인해보면 쿠키가 저장되어 있는 모습도 볼 수 있다. 그렇다면 세션은 어디에 저장되는 걸까? 막연하게 서버에 저장 된다고만 표현하지, 실제 어느 위치에 저장되는지 알기 어려웠...
sonarcloud
SonarCloud 적용 트러블 슈팅
summary 우아한테크코스 레벨4 HTTP 서버 구현하기 미션을 진행하던 중이었다. 미션대로 구현을 완료하고 PR(Pull Request)를 작성했는데 정적분석 툴 SonarQube 가 자동으로 동작하고, 분석 결과도 PR 페이지에서 곧장 보여주고 있었다?! 자세히보니 SonarQube가 아니라 SonarCloud 였다! SonarQube에서 제공하...
sql
QueryDSL 하나의 테이블에 2번 조인을 걸고 싶을 땐 어떻게 하는가?
QueryDSL에서 하나의 테이블에 각각 나눠서 2번 조인을 걸고 싶을 때가 있다. 예를 들면 부모(Parent), 시터(Sitter)의 정보를 각각 필요로 하는데 이들이 사용자(User) 테이블 하나로 구성되어 있는 경우다. 이런 경우 Q객체를 2가지 변수로 나누어 할당한 후, 조인을 걸면 된다! References [동일 entity , table...
string
자바 문자열 연결 (StringBuilder, StringBuffer, StringJoiner)
문자열 중간에 REGEX를 이용해서 문자열들을 이어줘야하는 경우가 있다. 보통 String.join이나 StringBuilder를 많이 사용해왔는데, StringJoiner를 통해서도 문자열을 이을 수 있었다. String.join String.join을 사용하는 경우는 대게 문자열이 이미 파싱되어 있는 경우 사용하게 된다. 즉, 이미 준비된 상태에서...
terraform
Terraform을 이용한 클라우드 인프라 환경 구성
🌕 Terraform 소개 새 AWS 인스턴스를 프로비저닝 하기 위해선 다음을 포함한 몇 가지 기본 정보를 수집해야한다. EC2 인스턴스 이름 운영 체제 (Image) VM 크기 지리적 위치 (Region) 보안 그룹 그 외… 대부분 개발자가 직접 AWS Console(GUI)을 조작하거나 CloudFormation Templates를 통해 프로비저닝...
tomcat
쿠키와 세션에서 세션은 어디에 저장되는가?
🍪 세션은 어디에 있지? 쿠키와 세션에 대해 공부하다보면, 쿠키가 클라이언트의 브라우저 스토리지(저장공간)에 저장된다는 것을 금방 알 수 있다. 실제로 브라우저의 쿠키 저장공간을 확인해보면 쿠키가 저장되어 있는 모습도 볼 수 있다. 그렇다면 세션은 어디에 저장되는 걸까? 막연하게 서버에 저장 된다고만 표현하지, 실제 어느 위치에 저장되는지 알기 어려웠...
trouble shooting
소나큐브 설치하기
이 글에서는 현재 최신버전인 9.0버전이 아니라, LTS버전인 8.9버전을 사용했다! 소나큐브는 프로그래밍 언어에서 버그, 코드 악취, 보안 취약점을 발견할 목적으로 정적 코드 분석으로 자동 리뷰를 수행하기 위한 지속적인 코드 품질 검사용 오픈 소스 플랫폼이다. 중복 코드, 코딩 표준, 유닛 테스트, 코드 커버리지, 코드 복잡도, 주석, 버그 및 보안...
trouble-shooting
Git rebase merge 트러블 슈팅
babble 팀에선 프로젝트 초기 단계에서 아래와 같은 Git branch merge 전략을 사용하고 있었다. 기존 babble 팀에서 사용하던 Merge 전략 신규 기능 개발시 Develop를 기준으로 새로운 브랜치를 생성하고 작업을 진행한다. 개발이 완료되었을 때 작업된 커밋 내용들을 Squarsh Merge를 이용해서 병합한다. Squarsh M...
unleash
Unleash custom strategy를 이용한 feature toggle 변수 필터 지정
feature toggle & Unleash feature toggle 이란 특정 지점에 분기를 형성하여 각 조건에 해당되는 대상에게 각기 다른 기능을 제공해줄 수 있다. 가령 “2022년 7월 1일부터 3일까지는 A기능을, 7월 4일부터는 B기능을 제공하고 싶다.” 라는 니즈가 있으면 7월 1일부터 3일까지는 feature toggle을 ON...
web-server
Nginx vs Apache
우아한테크코스 피케이의 테코톡을 참고해서 정리한 내용이다! 🌲 Nginx란 무엇인가요? 리버스 프록시, 로드밸런스, http 캐시 등 다양한 기술을 제공하는 웹 서버 프로그램이다. 이벤트 기반 구조(Event-Driven-Model)를 가지고 있으며, 현재 아파치 서버와 함께 웹 서버 분야에서 1,2 등을 다투고 있다. 도대체 이벤트 기반 구조란 무엇...
webserver
NGINX 다중 서버 upstream 설정
🚂 summary 기존 Web-server (Reverse-proxy) 역할로 사용자와 WAS(Web Application Server)간 통신을 이어주던 NGINX에서 소나큐브 서버도 통신을 지원하도록 설정하고 싶었다. 그림으로 표현하자면 아래와 같다. 🚂 nginx.conf 설정 # nginx.conf events {} http { # ------...
workflow
Github-actions 작업간 독립성
🐹 summary 스프링부트 서버 빌드와 소나큐브 서버 빌드를 하나의 workflow.yml 파일로 관리하던 중, 소나큐브 서버 빌드시 동작하는 jacoco가 스프링부트 서버 빌드에서 진행되는 테스트코드 결과물(부산물)을 필요로 한다는 걸 깨닫고 스프링부트 서버 빌드가 소나큐브 서버 빌드보다 먼저 실행되도록 needs 키워드를 통해 의존성을 부여했다....
x84_64
Mac M1 no matching manifest 에러 해결
💻 에러 발견 Mac M1 환경에서 미리 작성된 docker-compose.yml 파일을 실행시켰을 때 아래와 같은 에러를 마주할 수 있었다. $docker-compose up -d [+] Running 0/4 ⠦ ... Pulling ⠦ ... Pulling ⠦ ... Pulling ⠏ ... Pulling ... layer no matching m...
국가근로장학생
4학년 1학기를 돌아보며 : 국가근로 아르바이트
올해 1학기에 들어설 때 세웠던 계획이 총 5가지 였다. 성공적으로 졸업작품을 진행할 것 코딩테스트 연습 오픽/토스 점수 취득 정보처리기사 자격증 취득 빚지지 않을 만큼 돈벌기 (아르바이트) 8월 22일 기준으로 2.5가지 진행을 완료했다. 소수점이 나온 이유는 정보처리기사 필기를 이제 끝냈기 때문… 앞으로 실기까지 붙어야 3가지를 완성했다고 말할 수...
배민다움
reading books / 배민다움
책을 읽기 전에 어느 덧 우아한테크코스 교육과정에 막바지에 다다르고 자기소개서를 준비하는 11월이다. 루터회관으로 향하는 아침, 버스 안에서 ‘내가 지원하고자 하는 기업들에 대해 얼마나 알고 있지?’ 라는 생각이 머릿 속을 스친다. 멍하니 허공을 응시해보지만 시덥지 않은 생각만 떠올라 반성하게 된다. 결국 루터회관에 도착하자마자 부랴부랴 다른 크루의 ...
비전공자에게 설명하기
비전공자에게 ROM 설명하기
중학교 동창들이 모여있는 단톡방에서 “저장 장치가 가득 찼는데 왜 C만 가득차고 D는 안차냐?” 는 독특한 소재의 이야기가 나왔다. 평소에도 컴퓨터 동작에 대해 관심과 질문이 많았던 친구라 여러차례 간단한 설명을 해준적이 있었는데, 이번엔 직접 검색까지 해봤다는 걸 봐선 원리까지 궁금해 하는 것 같았다. 마침 스터디 카페에서 멍 때리고 커피만 홀짝홀짝...
세미나
우아한 멀티 모듈 세미나 정리
권용근님의 우아한 멀티 모듈 세미나를 보고 정리한 내용 ♟️ MSA? 멀티 모듈? 모놀리틱(Monolithic) 아키텍쳐 하나의 서비스에서 API, ADMIN, BATCH, WEB, DB 등이 관리되는 구조를 모놀리틱 아키텍쳐라 부른다. 모놀리틱 아키텍쳐는 크게 단일 모듈 멀티 프로젝트와 멀티 모듈 단일 프로젝트로 나뉜다. MSA 서비스가 내부적으로 ...
시스템디자인
트위터 시스템 디자인 실험기
본문 속 테스트 코드 및 데이터는 https://github.com/Hyeon9mak/twitter-system-design/ 에서 확인할 수 있습니다. 🐦 우연히 접한 트위터 시스템 디자인 출근 시간에 기술 관련 유튜브 영상을 틀어놓았다가 우연히 코맹탈출 채널의 트위터 시스템 디자인 완전정복 | 1억 유저 처리의 비밀 영상을 접하게 되었다. 1억명이...
실험
트위터 시스템 디자인 실험기
본문 속 테스트 코드 및 데이터는 https://github.com/Hyeon9mak/twitter-system-design/ 에서 확인할 수 있습니다. 🐦 우연히 접한 트위터 시스템 디자인 출근 시간에 기술 관련 유튜브 영상을 틀어놓았다가 우연히 코맹탈출 채널의 트위터 시스템 디자인 완전정복 | 1억 유저 처리의 비밀 영상을 접하게 되었다. 1억명이...
열혈C프로그래밍
열혈C프로그래밍을 복습하면서 배운 것들
# 1학년 과목을 재수강 하고 있다. 새내기 시절 ‘정말 저렇게 살아도 될까?’ 싶을 정도로 학교생활을 즐겨서 전공 과목 점수가 영 순탄하지 못했다. (후회는 없다! 잘 놀았어! 🤤) 그 중에서도 가장 기본이 되는 C프로그래밍 과목 점수들이 모두 C+ + 하나만 더 있으면 C++이 되겠는데? 다행히 복학 후 학업에 관심을 갖게 되면서 학점을 야금야금 ...
우아한멀티모듈
우아한 멀티 모듈 세미나 정리
권용근님의 우아한 멀티 모듈 세미나를 보고 정리한 내용 ♟️ MSA? 멀티 모듈? 모놀리틱(Monolithic) 아키텍쳐 하나의 서비스에서 API, ADMIN, BATCH, WEB, DB 등이 관리되는 구조를 모놀리틱 아키텍쳐라 부른다. 모놀리틱 아키텍쳐는 크게 단일 모듈 멀티 프로젝트와 멀티 모듈 단일 프로젝트로 나뉜다. MSA 서비스가 내부적으로 ...
일지
랜덤 뽑기(가챠) 시스템 구현하기
어릴적 문방구 앞에서 100원 짜리 가챠(랜덤 뽑기)를 돌려본 경험이 있는가? 광고 포스터 속 캐릭터 피규어를 보면서 설레이는 마음에 100원이라는 거금을 투자했지만, 알사탕이 들어있는 캡슐이 데구르르 굴러 나올 때 그 절망감은 평생 잊을 수가 없겠다. 나는 이런 가챠류에서 항상 운이 좋지 않았기 때문에, 그다지 가챠 시스템을 선호하지 않는다. 우연히...
정보처리기사
4학년 1학기를 돌아보며 : 정보처리기사 필기
올해 1학기에 들어설 때 세웠던 계획이 총 5가지 였다. 성공적으로 졸업작품을 진행할 것 코딩테스트 연습 오픽/토스 점수 취득 정보처리기사 자격증 취득 빚지지 않을 만큼 돈벌기 (아르바이트) 8월 22일 기준으로 2.5가지 진행을 완료했다. 소수점이 나온 이유는 정보처리기사 필기를 이제 끝냈기 때문… 앞으로 실기까지 붙어야 3가지를 완성했다고 말할 수...
졸업작품
4학년 1학기를 돌아보며 : 졸업작품 진행
올해 1학기에 들어설 때 세웠던 계획이 총 5가지 였다. 성공적으로 졸업작품을 진행할 것 코딩테스트 연습 오픽/토스 점수 취득 정보처리기사 자격증 취득 빚지지 않을 만큼 돈벌기 (아르바이트) 8월 22일 기준으로 2.5가지 진행을 완료했고 (소수점이 나온 이유는 나중에) 진행하면서 겪었던 해프닝이나 느꼈던 점들에 대해 기록하기 위해 오랜만에 글을 써본...