본문 바로가기
  • 개발하는 곰돌이

분류 전체보기200

[Kotlin] 백준 13199 : 치킨 먹고 싶다 문제 링크 13199번: 치킨 먹고 싶다 서울대학교 301동에는 아는 사람만 아는 “눕치킨”이란 치킨집이 있다. 이 치킨집은 여느 치킨집처럼 치킨을 시킬 때 마다 쿠폰을 C 장 주고, 쿠폰을 F 장 모으면 치킨을 공짜로 시킬 수 있다. 눕 www.acmicpc.net 문제 해설 기본적으로 시킬 수 있는 치킨의 마리수와 치킨을 시키면서 받을 수 있는 쿠폰의 개수는 간단하게 구할 수 있다. val chicken = money / price val coupon = chicken * c 이제 두영이의 경우와 상언이의 경우를 나눠서 생각해보자. 두영이의 경우는 쿠폰으로 시키는 치킨에 쿠폰이 나오지 않는다. 따라서 기본 치킨 마리수에 쿠폰의 개수를 \(f\)로 나눈 값을 그냥 더해주기만 하면 된다. val dooy.. 2024. 3. 25.
[OOP] 원시 타입을 Wrapper Class로 포장해보자(Value Object) 목차 들어가기 전에 주의! 이 글에서 다루는 Wrapper Class는 일반적으로 자바에서 이야기하는 Integer, Double, Long 등과 같이 원시 타입에 대응하는 클래스가 아니라 개발자가 필요에 의해 작성한 별도의 클래스를 이야기 합니다. 여러 클래스들을 작성하다 보면 숫자 등의 원시 타입 멤버 변수들을 추가하는 경우가 매우 많다. 이러한 멤버 변수들은 클래스의 성질을 나타내기 위해 반드시 필요한 존재들인데 원시 타입 멤버 변수를 Wrapping(포장)해주는 클래스를 작성해서 사용한다면 몇가지 부가 효과를 얻을 수 있다. 이렇게 작성된 Wrapper Class의 객체를 값 객체(VO : Value Object)라고 한다. Wrapper Class를 사용하면 얻을 수 있는 장점을 정리해본다. 원.. 2024. 3. 18.
[Spring Boot] 스프링 인터셉터(Spring Interceptor)를 활용해서 API 로그를 DB에 기록해보자 목차 들어가기 전에 이전 포스트에서 AOP를 사용해서 API 로그를 기록하는 내용을 다뤘는데 이런 이야기를 들었다. 사실 지금까지 프로젝트를 진행하는 동안 인터셉터를 구현해서 사용했던 적이 없다보니 컨트롤러들에 공통으로 적용하는 로직은 익숙한 AOP로 구현했다. 그런데 인터셉터도 어쨌든 요청과 응답을 가로채서 일련의 행동을 수행하니까 인터셉터로 구현하는 것도 괜찮겠다는 생각이 들었다. 그래서 이번에는 스프링 인터셉터를 활용해서 API 로그를 기록해보려고 한다. 스프링 인터셉터는 어떻게 구성되는가? 스프링 인터셉터는 보통 HandlerInterceptor를 구현하는 별도의 클래스를 작성해서 구현한다. HandlerInterceptorAdapter를 상속받는 방법은 스프링부트 2.4(스프링 5.3)부터 De.. 2024. 3. 1.
[Kotlin] 백준 3107 : IPv6 문제 링크 3107번: IPv6 첫째 줄에 올바른 IPv6 주소가 주어진다. 이 주소는 최대 39글자이다. 또한, 주소는 숫자 0-9, 알파벳 소문자 a-f, 콜론 :으로만 이루어져 있다. www.acmicpc.net 문제 해설 문자열 파싱 문제. 조건에 맞게 축약된 IPv6를 원래 IPv6로 복원해야 한다. 문제에서 주어진 두가지 조건을 역순으로 생각해보자. 0으로만 이루어져 있는 하나 이상의 연속된 그룹을 하나 골라서 콜론 2개(::)로 바꿀 수 있다. IPv6는 8 그룹의 16진수로 구성되어 있다. 즉, 축약되지 않은 원래 형태는 7개의 콜론으로 16진수 그룹을 나누게 된다. 즉, 축약된 IP 주소에서 콜론의 개수가 7개가 되도록 보충을 해주면 된다. split()으로 문자열을 분리하면 빈 문자열이.. 2024. 2. 20.
[Spring Boot] AOP를 이용해서 DB에 API 로그를 남겨보자 목차 들어가기 전에 현재 운영중인 서비스는 API 로그를 파일로 기록하고 있다. 그런데 서버가 이중화되어 있고 그 외에도 몇가지 불편한 점이 있어서 DB에 로깅을 해보면 어떨까 하는 생각이 들었다. 서버가 이중화되어 있다보니 특정 로그를 확인하려면 양쪽 서버 모두 확인해야 한다. → 사실상 가장 불편했던 점 특정 요청건에 대한 로그를 찾아보기 어렵다. 요청 일자가 모호할 경우에 여러 파일을 열어서 확인해야하는 경우 등 일자별, 시간대별 요청 건수 확인이 어렵다. 특정 요청이 처리되고 있는 도중에 다른 요청이 들어오면 로그에 혼선이 생겨서 어떤 요청에 대한 응답인지 파악하기 어려워진다. 이런 이유들로 인해 파일 대신 DB에 API로그를 남겨보려고 했는데 어차피 모든 API의 중복 로직이니까 AOP를 사용해.. 2024. 2. 6.
[JPA] 트랜잭션의 전파와 UnexpectedRollbackException 이슈 목차 들어가기 전에 지금까지 스프링부트 프로젝트에 JPA를 사용하면서 트랜잭션이 필요한 메소드에 기계적으로 @Transactional 어노테이션을 붙여서 사용하다가 처음 보는 예외를 맞닥뜨렸다. 트랜잭션에 rollback-only가 마킹되어 자동으로 롤백되었다고 한다. 이게 도대체 무슨 말인가 싶어서 관련 내용을 찾아보고 정리해본다. 문제 상황 DB에 API 호출 이력을 남기기 위해 컨트롤러에 @Transactional(dontRollbackOn = [Exception::class])을 달아주고 트랜잭션이 필요한 서비스 계층의 메소드들에 @Transactional을 달아준 상황이었다. 대충 아래와 같은 느낌이라고 보면 될 것 같다.(실제 코드가 아닌 상황 재현을 위한 코드) @Transactional(d.. 2024. 1. 29.
[Kotlin] 백준 25240 : 가희와 파일 탐색기 2 문제 링크 25240번: 가희와 파일 탐색기 2 Q개의 질문에 대해, 연산이 성공하면 1을 실패하면 0을 출력해 주세요. 각 질문에 대한 답은 한 줄에 하나씩 출력해 주세요. www.acmicpc.net 문제 해설 리눅스의 파일 권한과 관련된 문제. 관련 지식이 있다면 어렵지 않게 풀 수 있다. 우선 각 권한을 2진수로 바꿔보자. \begin{align*} 000 &\to 권한 없음\\ 001 &\to 실행 가능\\ 010 &\to 수정 가능\\ 011 &\to 실행 및 수정 가능\\ 100 &\to 읽기 가능\\ 101 &\to 읽기 및 실행 가능\\ 110 &\to 읽기 및 수정 가능\\ 111 &\to 읽기, 수정, 실행 모두 가능 \end{align*} 여기서 \(2^2\)에 해당하는 비트는 읽기.. 2023. 12. 30.
[Spring Boot] @Value 대신 생성자 바인딩을 통해 프로퍼티 값을 바인딩하고 관리해보자 목차 들어가기 전에 스프링부트 프로젝트를 개발하다 보면 운영/개발 등의 환경에 따라 코드에 들어가야 하는 값이 달라지는 경우가 있다. 단순히 현재 서버가 어떤 서버인지를 확인해줄 문자열이 될 수도 있고, 다른 API를 통해 서비스를 제공하는 프로젝트라면 해당 API를 제공하는 서버 호스트가 될 수도 있다. 이렇게 구동 환경에 따라 달라지는 값들은 yml파일 또는 properties 파일에서 프로파일을 나눠서 관리하고 실제 코드에서는 @Value로 값을 바인딩해서 사용하게 된다. 그런데 @Value로는 final 변수에 값을 바인딩하려면 롬복으로 생성자를 선언하는 방식을 사용할 수 없기 때문에 변경사항이 발생했을 때 굉장히 귀찮아진다. 이 경우 생성자 바인딩이라는 방식을 통해 프로퍼티 설정 값을 수월하게 .. 2023. 12. 21.