본문 바로가기 메뉴 바로가기

How to be awesome

프로필사진
  • 글쓰기
  • 관리
  • 태그
  • 방명록
  • RSS

How to be awesome

검색하기 폼
  • 분류 전체보기 (151)
    • Java (32)
    • Algorithm (26)
    • JSP & Servlet (0)
    • Spring Framework (15)
    • Git & Github (6)
    • Database (11)
    • Linux (3)
    • Design Pattern (12)
    • JPA (7)
    • Project (14)
    • JavaScript (4)
    • Development (14)
    • HTML&CSS (1)
    • AWS (5)
  • 방명록

디아2 하다가 갑자기 OCR 공부

디아블로2를 다시 시작했다. 예전이나 지금이나 이 게임의 진입장벽은 역시 '아이템 가치'를 아는 것에서 시작된다. 초보자 입장에서는 줍는 족족 커뮤니티나 거래 사이트를 뒤져야 하는데, 이게 여간 번거로운 게 아니다."그냥 화면을 찍으면 거래사이트 정보와 AI가 바로 가치를 알려줄 순 없을까?"단순한 호기심에서 시작된 이 고민이 생각보다 깊은 삽질의 시작이 될 줄은 몰랐다.기존 OCR과 비전 모델의 한계처음엔 요즘 잘나가는 일반 OCR 모델과 비전(Vision) 모델에 냅다 스크린샷을 던져봤다. 결과는 참담했다. 그나마 비전 모델이 맥락을 짚어내긴 하지만, 실사용하기엔 정확도가 턱없이 낮았다.디아블로2 특유의 반투명한 툴팁 배경과 독특한 폰트가 문제였다. 인간의 눈에는 명확해 보여도, 기계 입장에서는 배경..

카테고리 없음 2026. 3. 5. 08:17
유닛 테스트에서 '비즈니스 Fixture 객체'를 버려야 하는 이유

유닛테스트 코드를 짜다 보면 어느덧 검증 로직보다 '테스트를 위한 준비 과정'이 더 길어지는 순간을 마주한다. 특히 특정 비즈니스 상태를 재현하기 위해 여러 도메인 모델을 조합하고 상태를 주입한 픽스처(Fixture) 객체를 공용으로 만들어 쓰기 시작할 때, 불행은 시작된다. 흔히 픽스처라고 하면 데이터베이스 연결 상태나 환경 변수 같은 인프라적 설정도 있지만 내가 경계하는 것은 비즈니스 상태를 미리 정의해둔 객체 덩어리다. 편리할 것 같지만 사실 이것은 테스트 코드의 건강을 해치는 독이 될 때가 많다. 1. 픽스처 객체는 테스트 코드의 의도를 알기 어렵게 만든다.공용 픽스처 객체를 사용하는 테스트는 불투명하다. 테스트 코드를 읽을 때, `setupUser()`가 반환하는 픽스처 객체의 어떤 필드가 이 ..

Development 2026. 1. 25. 09:51
ORM은 레거시가 될까?

어느덧 개발자들 사이에서 JPA같은 ORM 기술은 언어를 가리지 않고 선택이 아닌 필수 교양이 되었다. 개발자 면접에서도 영속성 컨텍스트의 원리나 N+1 문제의 해결책을 묻는 것이 당연한 코스가 되었다. 하지만 문득 의문이 들었다. 당연하게 믿고 있는 이 도구가 사실은 레거시가 되어가지 않을까? 1. ORM은 왜 대세가 되었을까?ORM을 배우는 이유는 명확했다. 지루하고 반복적인 CRUD 쿼리 작성을 자동화하여 개발 효율을 높이고, 테이블 중심이 아닌 객체지향적인 사고로 비즈니스 로직을 구현하기 위함이다. 하지만 지금은 AI가 코딩하는 시대다. 과거에는 수십 개의 컬럼을 매핑하고 쿼리를 짜는 것이 '고비용 작업'이었지만, 이제는 AI에게 스키마만 던져주면 최적화된 SQL과 DTO 매핑 코드를 1초 만에 ..

Development 2025. 12. 27. 04:42
Next.js와 Supabase를 접고 다시 스프링으로

나는 회사에서는 자바와 스프링을 주로 쓰는 백엔드 개발자로 일하지만, 개인적인 사이드 프로젝트에 대한 관심이 꾸준히 있었다. 그래서 개발 속도가 빠르고 유지보수가 편한 기술 스택을 따로 알아보고 공부하기 시작했다. 그러다가 Supabase와 Next.js로 프로젝트들을 만들기 시작했고, 개발 속도 측면에서는 꽤 만족스러웠다. Supabase와 Vercel을 사용하면 서버비용 0원으로 시작할 수 있었고 서버 관리 부담도 거의 없어서 꽤 괜찮다고 생각했다. 프리티어를 넘는 트래픽이 오면 25달러와 20달러 정도는 충분히 낼 만한 프로젝트가 되리라 착각하기도 했다. 하지만 현실은 달랐다.프리티어를 겨우 넘었을 뿐인데 매달 약 50달러의 비용이 발생했고, MAU가 크게 늘지 않으면서 이 고정비가 계속 유지되었다..

Development 2025. 11. 18. 08:30
Exception throw를 두려워하지 말자.

최근 코드를 보다 보니 문득 드는 생각이 하나 있었다.“왜 이렇게 Exception catch가 숨어있지?” 백엔드 코드를 짜다 보면, 서비스 로직이라는 게 있고, 그 외의 ‘도구적인 작업’들이 있다.DB를 쓰거나, 외부 API를 호출하거나, 캐시를 쓰거나, 이벤트를 전송하는 그런 것들.근데 문제는... 이런 도구적인 부분에서 너무 과도한 예외 처리를 해버린다는 거였다. 물론 의도는 좋았다. 장애가 안 나게 막으려는 거니까.근데 이게 꼭 좋은 건 아니라는 생각이 들었다.왜냐면 예외를 그 자리에서 catch하고, 자체적으로 fallback을 처리해버리면그건 서비스 로직 바깥에서 서비스 로직을 대신 결정해버리는 셈이었으니까. 예를 들어보자.DB 저장이 실패했을 때, 외부 API 호출이 실패했을 때그 상황에서..

Development 2025. 11. 2. 12:23
Spring Batch에서 JSON 형식 JobParameter 전달하기

개발 환경Spring Boot: 3.5.0Spring Batch: 5.2.2Java: 21문제 상황Spring Batch Job을 실행할 때 아래와 같은 JSON 문자열을 파라미터로 전달하고 싶었습니다.{ "myType": "MY_TYPE_VALUE", "myArray": [ { "key": {"id": "001", "category": "MY_CATEGORY_VALUE"}, "param": {"foo": "002", "bar": "sampleValue"} } ]}하지만 일반적인 방식으로 전달하면 다음과 같은 에러가 발생했습니다:JobParametersConversionException: Unable to parse job parameter 왜 JSON 전달이 안 될까?..

Spring Framework 2025. 11. 1. 13:24
MSA에서 헥사고널 아키텍처가 적절하지 않은 이유

의존 역전에 대한 고찰객체지향의 가장 큰 장점은 의존 방향을 우리가 원하는 대로 제어하기 쉽다는 점이다. 예를 들어 A → B 구조에서 B의 변동 가능성이 클 경우, A → I ← B 형태로 구조를 바꿔서 A를 변화와 확장으로부터 보호하는 것, 그게 핵심이다. 여기서 중요한 건 A와 I가 같은 바운더리 안에 있어야 한다는 점이다. 왜냐하면 I는 A가 원하는 인터페이스이기 때문이다. 그런데 의존을 역전시켰다고 하면서 I와 B를 같은 바운더리에 위치시키는 경우가 종종 보이는데 이는 의존 역전에 대한 오해다. 의존 역전의 본질은 인터페이스를 사용했다는 것 자체가 아니라, 변동에 대한 제어 주도권을 역전시켜 가져왔다는 점이다. 마이크로서비스에서의 의존역전MSA의 기술적 성장은 안정화되어 가고 있지만, 개발자들의..

Development 2025. 7. 1. 07:36
Next.js + Vercel 환경에서 한글 검색 구현 삽질기록

Next.js + Vercel 환경에서 한글 검색 구현기: 삽질기부터 직접 bigram 구현까지Next.js + Vercel 환경에서 한글 검색 기능 구현이 의외로 골치 아픈 일이었고 이를 정리하기 위해서 공유합니다. 1) LIKE 검색? 간단하지만 성능에 불안 요소처음엔 누구나 WHERE title LIKE '%검색어%'로 시작합니다.간단하죠. 하지만 다음과 같은 문제가 있습니다:인덱스를 타지 못해 데이터가 많아지면 검색 속도가 확 느려짐전체 스캔이 발생해 비용이 비쌈단순 포함 검색이라 의미 기반 검색 불가그래서 바로 포기했습니다. 2) PostgreSQL tsvector? …한글 형태소 분석은 미지원PostgreSQL의 tsvector + to_tsvector 조합은 풀텍스트 검색을 위해 매우 강력한..

Development 2025. 5. 4. 20:23
이전 1 2 3 4 ··· 19 다음
이전 다음

Blog is powered by Tistory / Designed by Tistory

티스토리툴바