본문 바로가기

Til23

TIL : gradle-build-action (짧) 🏃‍♂️ Github Action 이번에 CI를 작성하면서 시간이 생각보다 더 걸려서 gradle을 캐싱해야 하는 일이 생겼다. 처음에는 "CI를 굳이 어렵게 가야하나? 적당히 긁어와서 쓰자"라는 생각으로 다음 코드를 붙여서 사용했다. - name: Gradle Caching uses: actions/cache@v3 with: path: | ~/.gradle/caches ~/.gradle/wrapper key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle- 근데 뭔가 시간적으로 개선이 안되는 것 같아서 "다른 방법이 없을.. 2023. 10. 27.
TIL : import문이 빨갛게 되고 import가 안되는 문제 고치기 (IntelliJ) (23) 🏛️ IntelliJ 가끔 인텔리제이를 사용하다가 import문이 고장 나는 경우가 있습니다. 다음과 같이 말이죠 🥹🥹 어김없이 구글링을 통해서 해결하려고 신나게 찾아다녔습니다. 다행히도 결과는 많았습니다. 캐시도 비워보고, JDK도 확인해보고 프로젝트도 리빌드를 해보았지만 어떤 방법도 통하지 않았습니다. 🥹🥹 한참을 뻘짓하다가 기능을 하나 찾았습니다! 다행히도 IDE 자체에서 고장을 고치는 기능이 있었습니다. File > Repair IDE 탭에서 찾을 수 있는 기능입니다. 😎😎 저같은 문제를 겪으신 분이 있다면 이 기능을 한번 꼭 써보시기 바랍니다 ㅎㅎ😋😋 😋 지극히 개인적인 블로그지만 훈수와 조언은 제 성장에 도움이 됩니다 😋 2023. 6. 21.
[Spring] @Valid, @Validated과 Custom Annotation (2) 😋 들어가기 앞서 1편에 이어서 커스텀 어노테이션을 구현하고 이에 필요한 예외를 어떻게 처리했는지 다루겠다! 유효성 처리를 위해서 세 가지 단계가 필요하다. 어노테이션 구현하기 유효성 검사기 구현하기 발생하는 예외 다루기 🪄 어노테이션 구현하기 비밀번호를 검증하는 어노테이션을 통해서 이해해 보겠다! 어노테이션이 어떻게, 어디서, 무엇으로, 누구에게 사용될지 등의 정보는 메타 어노테이션과 필드값으로 명시해줘야 한다. @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = PasswordFormatValidator.class) public @interface PasswordFormat { String .. 2023. 3. 21.
[Spring] @Valid, @Validated과 Custom Annotation (1) 👀 들어가기 앞서 이번에 프로젝트를 진행하다가 DTO와 객체에 대한 유효성 검증을 어떻게 할까 많이 고민했다. 별도로 검증하는 클래스를 만들자니 대상이 많이 없어서 괜히 구현하면 의존성만 커질 것 같았다. 그래서 Annotation을 구현해서 검증을 해보도록 했다. 🤔 왜 사용했나요? 커스텀 어노테이션은 양날의 검이라고 생각한다. 덕지덕지 붙은 어노테이션 불호..! 어노테이션을 까보지 않는 이상 어떤 의도로 동작하는지 정확하게 알 수 없기 때문이다! 하지만 간결함이 큰 강점이기 때문에 고민했다. 이메일을 후보키처럼 사용해 많은 로직에 이메일을 요구했는데, 검증용 클래스가 그만큼 여러 곳에서 사용되었다. 커스텀을 통해서 검증 클래스를 없애 의존성을 줄이고, 서비스 계층에 들어오기 전에 처리하고 싶었다. 추.. 2023. 3. 19.
TIL : 위상정렬 알고리즘 (21) 💻 알고리즘 📌 위상정렬 알고리즘 Cycle이 없는 방향 그래프에서 작업 순서를 구하는 알고리즘이다. 이전에 공부한 적 있으나 기록을 남겨두지 않아서 남겨두려고 한다. 💡 특징 순환하지 않는 방향 그래프에서만 가능하다. 진입 차수 (in-degree) 또는 진출 차수 (out-degree)를 이용한다. 여러 개의 답이 존재할 수 있다 O(V+E)의 시간 복잡도를 가진다. 💡 동작 원리 (진입차수 ver) 진입 차수가 0인 정점을 큐에 넣는다. 큐에서 원소를 꺼내 연결된 간선을 제거한다. 진입 차수가 0이라면 해당 정점을 큐에 삽입한다. 마지막에 Cycle의 존재 유무를 확인한다. 결과의 크기가 정점의 개수보다 작다면 Cycle이 존재하는 것이다. from collections import deque de.. 2023. 3. 3.
[Java] Reflection 🎇 Java Java를 사용하다 보면 리플렉션(Reflection)이라는 용어를 자주 접한다. 대충 무엇인지는 알겠는데 설명해 주세요! 하면 못 할 것 같아서 정리해 본다😋😋 🪞 리플렉션, Reflection 리플렉션이란? 단어의 의미를 떠올려서, 거울에 반사된 어떤 대상을 제약 없이 사용하는 기술이다. 자세하게 설명하면, 힙 영역에 로드된 Class 타입의 객체를 통해서 인스턴스를 생성하고, 접근 지정자의 제약 없이 인스턴스의 메소드와 필드를 사용할 수 있게 하는 Java API이다. 😮 힙 영역에서 Class 타입 가져오기 힙 영역에 로드된 Class 타입은 다음 3가지 방법으로 가져올 수 있다. 클래스.class 인스턴스.getClass() Class.forName(클래스명) public class.. 2023. 1. 11.