홈으로 돌아가기

Scala Pastebin의 14년: 지원 교훈

이 글은 Scala, Spring, Hibernate 기반 내부 Pastebin의 14년 진화를 설명합니다. 호환성 문제, Compass 및 Tiles 프레임워크 붕괴, Maven 선택 등을 다룹니다. 레거시 프로젝트 지원 교훈.

14년간 Pastebin 지원 방법: 프레임워크 붕괴와 Scala
Advertisement 728x90

내부 페이스트빈 14년 지원: 기술 스택 진화에서 얻은 교훈

코드와 로그 공유를 위한 내부 도구, 페이스트빈과 유사한 서비스가 2012년 출시되어 14년간 운영되었습니다. 초기에는 '페이스트' 저장과 링크 생성, 오래된 항목 자동 삭제 기능을 가진 간단한 웹 폼이었습니다. 이후 구문 강조, 줄별 코멘트, 인증, 텍스트 위 그림 그리기 기능이 추가되었습니다. 핵심 가치는 외부 서비스 없이 로컬 배포가 가능하다는 점이었습니다.

이 프로젝트는 독창성을 주장하지 않습니다: 이러한 솔루션은 쉽게 재현 가능합니다. 주요 도전은 개발이 아닌 장기 지원이었으며, 기술은 구식이 되고 프레임워크는 사라지며 사용자 기대는 커집니다.

기술 스택: 스칼라와 스프링, 하이버네이트의 조합

스택 선택은 가용성과 관심에 의해 결정되었습니다: 클래식한 스프링-하이버네이트-JSP 설정에서 자바 대신 스칼라를 사용했습니다. 스칼라 2.x는 JVM 바이트코드로 컴파일되지만, 통합 과정에서 호환성 문제가 드러났습니다.

Google AdInline article slot
  • 어노테이션과 클래스 스캐너: 스프링과 하이버네이트가 스칼라 바이트코드를 올바르게 처리하지 못했습니다. Entity 필드의 예시 문제:
@ManyToOne(fetch = FetchType.EAGER, cascade = Array(CascadeType.PERSIST, CascadeType.MERGE))
@JoinColumn(name = "owner_id")
private var owner: User = null

필드에 명시적 기본값이 필요했습니다.

  • 데이터 타입, 상속, 열거형, 어노테이션: 다양한 호환성 문제가 시행착오를 통해 해결되었습니다.

NoSQL과 파일 저장소는 피했습니다: 재시작 시 데이터 손실은 용납할 수 없었습니다. 인덱싱을 위한 Lucene은 업데이트 시 중복을 발생시켰습니다.

빌드 시스템: sbt 대신 메이븐

2012년 당시 sbt는 미숙했으며, IDE와 CI 통합이 부족했습니다. 메이븐은 안정성을 제공했습니다: SonarQube, 다중 데이터베이스, 다중 서블릿 컨테이너 지원이 가능했습니다.

Google AdInline article slot

14년간 메이븐의 장점:

  • 예측 가능한 릴리스.
  • 생태계와의 쉬운 통합.
  • 최소한의 설정 변경.

sbt는 발전했지만, 마이그레이션은 필요 없었습니다—메이븐은 한 번도 실망시키지 않았습니다.

컴패스 검색의 종말

컴패스는 엘라스틱서치의 전신으로, 하이버네이트/스프링과 통합된 임베디드 검색을 제공했습니다. 2014년까지 프로젝트는 사라졌습니다: 작성자가 분산형 ES로 이동했습니다.

Google AdInline article slot

결과:

  • 오래된 라이브러리에 대한 의존성으로 업데이트가 중단되었습니다.
  • 죽은 코드를 지원하는 데 5년이 걸렸습니다.
  • 하이버네이트 검색으로의 마이그레이션은 첫 시도에서 성공하지 못했습니다.

교훈: 업스트림 프로젝트 활동을 모니터링하세요.

아파치 타일즈와 JSP 템플릿의 문제점

타일즈는 JSP에 템플릿 구성을 추가했으며, 기본 기술은 include 지시문에 제한되었습니다. 각 페이지는 구조를 중복했습니다:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
   <c:import url="header.jsp" />
</head>
<body>
   <%@include file="body.jsp"%>
</body>
<footer>
   <jsp:include page="footer.jsp" />
</footer>
</html>

리팩토링은 악몽이 되었습니다. 타일즈도 사라지면서 문제는 악화되었습니다.

저장소와 커밋: 14년간 하나의 GitHub 저장소

여가 시간 개발은 이상적이지 않은 커밋으로 이어졌습니다. 최근 버전의 코드는 정리되었으며, 프로젝트는 안정적입니다. 공개 접근은 포크와 기여를 단순화합니다.

핵심 교훈

  • 프로젝트 지원은 개발보다 중요합니다: 기술은 기대보다 빠르게 구식이 됩니다.
  • 가용성에 기반한 스택 선택은 작동하지만 호환성 테스트가 필요합니다(스칼라 + 스프링/하이버네이트).
  • 죽은 프레임워크(컴패스, 타일즈)는 당신을 끌어내립니다: 로드맵을 모니터링하세요.
  • 메이븐은 레거시 프로젝트에서 안정성을 위한 금본위제로 남아 있습니다.
  • 사용자 데이터는 임시 도구에서도 중요합니다.

전반적으로, 이 프로젝트는 엔터프라이즈 개발의 현실을 보여줍니다—90%의 노력이 유지보수에 소요됩니다.

— Editorial Team

Advertisement 728x90

다음 읽기