반응형
1️⃣ 마커란 무엇인가?
"마커"란, 추가 메서드 없이 단순히 '특정 속성을 표시'하는 용도의 구조를 말함
자바에는 두 종류가 있음
| 종류 | 예시 | 특징 |
| 마커 인터페이스 | Serializable, Cloneable | 타입 수준에서 표시 |
| 마커 애노테이션 | @Override, @Deprecated | 소스 코드 수준에서 표시 |
둘 다 "이 객체는 ~한 성격을 가진다"는 의미를 전달하지만,
적용 범위와 역할이 다름
2️⃣ 마커 인터페이스의 대표 예시
자바 표준 라이브러리에서 이미 여러 예시를 볼 수 있음
public interface Serializable {}
public interface Cloneable {}
이 인터페이스들은 메서드를 하나도 가지지 않음
그저 "이 객체는 직렬화/복제가 가능하다"는 타입 표시(marker)로만 쓰임
3️⃣ “그럼 애노테이션 쓰면 되지 않나?”
@Marker 애노테이션 붙이면 똑같이 표시할 수 있잖아?
맞지만,
둘은 근본적으로 다른 계층에서 작동함
| 비교 항목 | 마커 인터페이스 | 마커 애노테이션 |
| 작동 시점 | 컴파일/런타임 모두 | 주로 런타임 |
| 타입 검사 | 컴파일러가 instanceof, 제네릭 등으로 확인 | 리플렉션으로만 가능 |
| 적용 대상 | 클래스, 인터페이스 등 타입 단위 | 클래스, 메서드, 필드 등 다양 |
| 목적 | 타입의 일원으로 구분하기 위함 | 메타데이터를 추가하기 위함 |
즉,
마커 애노테이션은 단순한 "표시"지만,
마커 인터페이스는 "타입 체계의 일부"로 작동함
4️⃣ 실제 예시로 비교해보기
❌ 애노테이션으로 구현한 경우
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ThreadSafe {}
@ThreadSafe
public class ConcurrentCache { ... }
이 방식은 단순히 "표시"만 할 수 있고,
다른 클래스가 "ThreadSafe한 타입만 받겠다"는 제약을 줄 수 없음
✅ 마커 인터페이스로 구현한 경우
public interface ThreadSafe {}
public class ConcurrentCache implements ThreadSafe { ... }
public class ServiceRegistry {
void register(ThreadSafe service) { // 타입 안전성 확보
...
}
}
이제 컴파일러 수준에서 "ThreadSafe 타입만 허용"하도록 강제할 수 있음
즉, 마커 인터페이스는 타입 안정성을 제공함
5️⃣ 실무 예시 — 서비스 태그 인터페이스
예를 들어 Spring기반 서비스 레이어에서
특정 서비스만 별도의 트랜잭션 정책을 적용하고 싶을 때 👇
public interface ExternalService {} // 마커 인터페이스
@Service
public class PaymentService implements ExternalService { ... }
@Service
public class InternalCacheService { ... }
이제 트랜잭션 AOP 설정 시 다음처럼 조건을 걸 수 있음
@Around("@target(com.example.ExternalService)")
public Object externalTx(ProceedingJoinPoint pjp) throws Throwable {
// 외부 서비스만 별도 트랜잭션 처리
return pjp.proceed();
}
이렇게 하면
타입 계층으로도, AOP 조건으로도 의미가 일관되게 표현됨
반응형
'Java & Spring Boot' 카테고리의 다른 글
| 🧩 이펙티브 자바 item 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라 (0) | 2025.10.24 |
|---|---|
| ⚙️ 이펙티브 자바 item 48. 스트림 병렬화는 주의해서 사용하라 (0) | 2025.10.22 |
| 🧩 이펙티브 자바 item 31. 한정적 와일드카드로 API 유연성을 높이라 (0) | 2025.10.17 |
| 🧩 이펙티브 자바 item 24. 멤버 클래스는 되도록 static으로 만들라 (0) | 2025.10.16 |
| ⚙️ 이펙티브 자바 item 13. clone의 재정의는 주의해서 진행하라 (0) | 2025.10.15 |