본문 바로가기

전체 글1099

읽은 책 소감 - 테스트 주도 개발 (TDD) 대부분의 개발자들은 TDD (Test-Driven Development)보다는 TDD (Time-Driven Development)(?)에 더 익숙할 것 같다. 처음 이 책을 읽어보게 된 이유는 'TDD가 정말 좋은가?'에 대해 답을 얻기 위해서였다. 뭐 구글링하면 나오기야 하겠지만, 일단 직접 알아야 써보면서 장단점을 알 수 있는 거니깐 공부하게 되었다. 대학생 때부터 난 생각난걸 코드로 옮기는 구현력(?)과 예외가 될만한 경우의 수를 미리 생각하는건 나름 자신있는편이었다. 그래서 테스트가 정말 필요한거 맞아? 그냥 잘 짜면 되는거 아님? 이렇게 생각했었다. 실제로도 테스트 없이 짜도 문제가 거의 없었다. 하지만 만든게 실제 운영될 때, 내가 운영을 안할 수 있다. 또 혼자서 만드는게 아니다. 그리고 .. 2023. 4. 4.
읽은 책 소감 - 만들면서 배우는 클린 아키텍처 아무래도 난 조영호님과 관련된 책을 좋아하는 것 같다. 오브젝트도 정말 멋졌고, 객사오도 멋졌다. 이 책도 조영호님이 감수를 한 책이었고, 이번에도 정말 멋졌다. 최근 클린 아키텍처, 헥사고날 아키텍처에 대해 스터디를 진행하며 팀원의 추천으로 읽게 된 책이다. 144쪽밖에 안되는 얇은 책임에도 클린 아키텍처에 대해 정말 짧고 굵게 잘 담아낸 멋진 책이라 생각한다. 가끔씩 정확히 어떤게 좋은지 선택을 해주지 않고 넘어가는 편이긴 하지만, 전반적으로 클린 아키텍처를 구성하는 데에 충분한 양의 답을 제시해준다. 아키텍쳐에 관심이 있다면 일단 이것부터 읽고 다른걸 읽는게 이해하기 좋을 것 같다. 얇기도 하고 크게 어려운 내용도 없이 쉽게 잘 설명해준다. 특히 '11. 의시적으로 지름길 사용하기' 부분이 .. 2023. 4. 3.
읽은 책 소감 - 지속적인 통합 스터디로 진행했던 책이다. 책 내용 정리는 '[Study 009] 지속적인 통합' 에서 볼 수 있다. CI/CD 혹은 devOps라 불리는 내용에 대해 다루는 책이다. 읽기 편하고 쉬운 내용이면서도 CI/CD에 대해 어느정도 알 수 있다. CI/CD가 현재 거의 이루어지지 않는 곳에 CI/CD를 도입하려고 할 때 다같이 빠르게 읽고 도입하면 좋을 것 같다. 단점은 초판이 2008년에 나온 책이다보니, 현재와 기술적으로 맞지 않는 부분이 대부분이다. 예를들어 주로 빌드 스크립트들을 Ant를 사용한 빌드 스크립트로 알려준다. 그러니 마인드 적인 부분이나 CI/CD를 도입했을 때 얻는 이점, 어떠한 것들을 구축해야 하는지만 책에서 살펴보고 요즘 유행하는 CI/CD 기술들은 별도로 찾아보는게 좋을 것 같다. 즉.. 2023. 4. 3.
기본적인 자바 람다(Lambda) 목차 개인적으로 가독성이 좋은지 잘 모르겠어요. 개인적으로 람다가 정말 가독성이 좋은진 잘 모르겠다. 그렇다고 안쓴다는 얘기는 아니고, 쓰긴 쓴다. 다만 쓸 수 있다고 너무 아무대나 다 써버리면 읽기 편하다는 장점이 오히려 사라지는 것 같다. 코드가 짧다고 항상 가독성이 좋은건 아니다. 익명 클래스를 사용한 A보다는 람다를 사용한 B가 더 보기 편한게 맞다. 보기 편하긴 하지만 결국 아래처럼 좀 생소한 클래스에 써있다면 결국 까봐야 한다. 특히 생성자가 많다면 더 헷갈릴 것 같다. (물론 인텔리제이 기준 ctrl 누른상태로 클릭하면 해당 생성자로 바로 이동하긴 한다.) 아무튼 개인적으로 그렇다는거고, 코드가 더 짧아져서 어느 수준 이상의 실력이라면 보기 편한게 사실이다. 그러니 기본은 알아두자. 람다 기.. 2023. 4. 3.
Spring Initializr 에서 선택한 자바 버전은 어떤 의미일까? 목차 Spring Initializr는 자바 버전을 선택할 수 있다! 근데 알다시피 스프링 부트 3.0 부터는 자바 17 이상을 써야 하는데, Spring Initializr는 아무튼 버튼은 그대로 표출되어 있다. 이와 관련된 에러는 '스프링부트 3.0.0 프로젝트 생성시 에러 해결법' 에서 볼 수 있다. 그럼 궁금한건 그럼 저 "자바 버전을 선택하는게 어떤 의미가 있나?" 라는 부분이었다. 자바 버전을 변경하면 바뀌는 부분 스프링부트 2.7.X 버전이하일 경우 자바 버전을 바꾸면 변경되는 부분은 build.gradle의 sourceCompatibility 부분이다. 그리고 스프링부트 3.0.x 버전의 경우, 분명 3.0.0 초창기에는 Spring Initializr로 생성 시 17버전이 아니라면 저 부.. 2023. 4. 3.
[자바] 백준 23813 - 회전 (java) 목차 문제 : boj23813 필요 알고리즘 구현, 문자열, 수학 문자열로 문제에서 제시된대로 구현해주는 문제이다. ※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다. 풀이 문제 제한이 짧아서 그냥 문자열 자체로 자르고 붙이고 Integer.parseInt로 정수로 변경해주면서 구현해도 상관없다. 내 경우엔 숫자로 바꿔서 계산했다. 우선 mult는 입력으로 들어온 숫자의 자리수-1 만큼 0이 붙은 숫자이다. 예를들어 "12345"라면 .. 2023. 4. 3.
[종만북] ASYMTILING - 비대칭 타일링 (자바 java) 알고리즘 문제해결전략(종만북) 스터디 메인 페이지 목차 문제 : aoj-ASYMTILING 풀이 일단 대칭인 경우는 생각하지 않고, 2xn 타일링부터 생각해보자. dp[x]를 x번째 열까지 타일을 높는 경우의 수라 하자. 이 경우 dp[5]의 경우 아래 그림처럼 dp[4]에 2x1 타일을 놓는 경우와, dp[3]에 1x2 타일 2개를 놓는 경우가 있을 것이다. 즉, dp[x] = dp[x-1] + dp[x-2] 로 구할 수 있다. 답은 dp[n]이 된다. 그럼 다음으로 대칭인 경우를 제외해보자. 열이 홀수개일 경우 대칭인 경우는 이하처럼 중간에 2x1 타일이 있는 경우이다. 즉, dp[n]에서 dp[(n-1)/2] 를 빼주면 된다! (대칭인 경우를 빼면 되므로) 열이 짝수개인 경우엔 다음의 두 가지 경우.. 2023. 4. 3.
[종만북] PI - 원주율 외우기 (자바 java) 알고리즘 문제해결전략(종만북) 스터디 메인 페이지 목차 문제 : aoj-PI 풀이 각 테스트케이스에 대해 dp[x] 를 x번째 숫자까지 표현하기 위한 최소 난이도라 정의하자. 저 정의대로 구할수만 있다면 답은 dp[문자열 길이] 가 될 것이다. 현재 문자열의 z번 문자를 보고 있다고 해보자. 이 때 dp[x]가 x번째 숫자를 표현하기 위한 최소난이도임이 확실하다면 dp[z]는, min( dp[z-3] + '이전 3개의 문자 난이도', dp[z-4] + '이전 4개의 문자 난이도', dp[z-5] + '이전 5갱의 문자 난이도') 라고 할 수 있다. 따라서 이대로 구현해주면 된다! 말한대로 이전 3개, 4개, 5개의 난이도를 계산하면서 최소값을 갱신해나가면 된다. 점수 계산은 score() 함수로 처리했다.. 2023. 4. 2.
[자바] 백준 2033 - 반올림 (java) 목차 문제 : boj2033 필요 알고리즘 구현 반올림을 직접 해주면 된다. ※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다. 풀이 입력으로 들어온 숫자를 각 자리수별로 배열로 잘라두고 직접 반올림을 진행해주면 된다! 예를들어 "446"일 경우 아래처럼 진행된다. 코드 : github import java.io.BufferedReader; import java.io.InputStreamReader; public class Main {.. 2023. 4. 2.
[종만북] WILDCARD - Wildcard (자바 java) 알고리즘 문제해결전략(종만북) 스터디 메인 페이지 목차 문제 : aoj-WILDCARD 풀이 우선 '*'이 연속으로 있는 경우는 처리만 어렵게 만들고 하나만 있는 경우와 동일하다. 따라서 입력받은 W에서 '*'이 연속으로 있다면 하나로 변경해줬다. 즉, "ab********c" 라면 "ab*c"로 변경해준다. private String compressContinuousAsterisk(String w) { while (w.indexOf("**") != -1) { w = w.replace("**", "*"); } return w; } 그럼 이제 연속된 '*'이 하나로 합쳐진 W와 현재 보고 있는 문자열 cur에 대해 각각 포인터를 두고 움직인다고 해보자. 이 경우 두 개의 포인터가 가르키는 문자열이 동일하거.. 2023. 4. 2.