μλ° νλ‘κ·Έλλ°μμ λ§μ»€ μΈν°νμ΄μ€(marker interface)
λ λ©μλλ₯Ό νλλ λ΄κ³ μμ§ μμΌλ©΄μ, μμ μ ꡬννλ ν΄λμ€κ° νΉμ μμ±μ κ°μ§μ νμν΄μ£Όλ μΈν°νμ΄μ€λ₯Ό λ§νλ€. λνμ μΈ μλ‘ Serializable
μΈν°νμ΄μ€λ₯Ό λ€ μ μλ€. μ΄ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ ObjectOutputStream
μ ν΅ν΄ μ§λ ¬νν μ μμμ λνλΈλ€.
λ°λ©΄μ λ§μ»€ μ λν
μ΄μ
(marker annotation)
μ μλ° 5λΆν° λμ
λ μ λν
μ΄μ
κΈ°λ₯μ νμ©νμ¬, ν΄λμ€λ λ©μλ λ±μ νΉμ μμ±μ λΆμ¬νλ λ° μ¬μ©λλ€. μλ₯Ό λ€μ΄ @Deprecated
μ λν
μ΄μ
μ ν΄λΉ μμκ° λ μ΄μ μ¬μ©λμ§ μμμ νμνλ€.
λ§μ κ°λ°μλ€μ΄ λ§μ»€ μ λν μ΄μ μ΄ λ±μ₯νλ©΄μ λ§μ»€ μΈν°νμ΄μ€λ ꡬμμ΄ λμλ€κ³ μκ°ν μ μμ§λ§, μ€μ λ‘λ λ§μ»€ μΈν°νμ΄μ€κ° μ¬μ ν μ μ©ν κ²½μ°κ° μλ€.
λ§μ»€ μ΄λ Έν μ΄μ μ΄ λμλλ° μ¬μ©ν΄μΌν μ΄μ κ° μμκΉ?
λ§μ»€ μΈν°νμ΄μ€λ, λ κ°μ§ λ©΄μμ μ λν μ΄μ λ³΄λ€ μ₯μ μ κ°μ§λ€.
1) λ§μ»€ μΈν°νμ΄μ€λ νμ μ΄κΈ° λλ¬Έμ μ λν μ΄μ μ μ¬μ©νλ€λ©΄ λ°νμμλ λ°κ²¬λ μ€λ₯λ₯Ό μ»΄νμΌ νμμ μ‘μ μ μλ€.
μ¦, νμ μΌλ‘ μ¬μ©ν μ μλ€
λ§μ»€ μΈν°νμ΄μ€λ μ΄λ₯Ό ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ€μ ꡬλΆνλ νμ μΌλ‘ μ¬μ©ν μ μλ€. μ΄λ λ§μ»€ μ λν μ΄μ μΌλ‘λ λΆκ°λ₯ν λΆλΆμ λλ€. νμ μΌλ‘ νμ©ν μ μλ€λ κ²μ μ»΄νμΌ νμμ νμ 체ν¬λ₯Ό ν΅ν΄ μ€λ₯λ₯Ό μ¬μ μ λ°©μ§ν μ μλ€λ λ»μ΄λ€.
μλ₯Ό λ€μ΄, λ€μκ³Ό κ°μ΄ Serializable
μ ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ°μλ€μ΄λ λ©μλλ₯Ό μμ±ν μ μλ€.
μ΄λ κ² νλ©΄ Serializable
μ ꡬννμ§ μμ κ°μ²΄λ₯Ό μΈμλ‘ μ λ¬νλ €κ³ ν λ μ»΄νμΌ μ€λ₯κ° λ°μνλ€. μ¦, λ°νμμ΄ μλ μ»΄νμΌ νμμ μ€λ₯λ₯Ό λ°κ²¬ν μ μμ΄ μμ μ±μ λμΌ μ μλ€.
public void saveObject(Serializable obj) {
// κ°μ²΄λ₯Ό μ μ₯νλ λ‘μ§
}
{% hint style="info" %} λ§μ»€ μΈν°νμ΄μ€λ μ΄μΏν νμ μ΄κΈ° λλ¬Έμ, λ§μ»€ μ λν μ΄μ μ μ¬μ©νλ€λ©΄ λ°νμμμΌ λ°κ²¬λ μ€λ₯λ₯Ό μ»΄νμΌνμ μ μ‘μ μ μλ€ {% endhint %}
νμ§λ§ μλ°μ μ§λ ¬νλ μ»΄νμΌ νμ μ€λ₯ κ²μΆμ μ΄μ μ μ΄λ¦¬μ§ λͺ»νλ€.
Serializable
μ΄ μλ μμ νμ
μΈ Object
λ₯Ό κ°μ²΄λ‘ λ°λλ‘ μ€κ³λμ΄ λ°νμμμΌ λ¬Έμ κ° λ°μνλ€λ κ²μ μ μ μκΈ° λλ¬Έμ΄λ€.
λ§μ»€ μΈν°νμ΄μ€λ νΉμ ν΄λμ€ κ³μΈ΅μλ§ μ μ©λλλ‘ μ νν μ μλ€.
λ§ν¬ μ λν
μ΄μ
μ μ μ© λμ( @Target
)μ Element.Type
μΌλ‘ μ μΈν μ λν
μ΄μ
μ λͺ¨λ νμ
(ν΄λμ€, μΈν°νμ΄μ€, μ΄κ±° νμ
, μ λν
μ΄μ
)μ λ¬ μ μμ§λ§, λΆμ°©ν μ μλ νμ
μ λ μΈλ°νκ² μ νν μλ μλ€.
λ°λ©΄, λ§ν¬ μΈν°νμ΄μ€λ κ·Έλ₯ λ§νΉνκ³ μΆμ ν΄λμ€μμλ§ κ·Έ μΈν°νμ΄μ€λ₯Ό ꡬννλ©΄ λ§νΉλ νμ μ μλμΌλ‘ κ·Έ μΈν°νμ΄μ€μ νμ νμ μμ΄ λ³΄μ₯λλ€.
public interface SpecialFeature extends BaseFeature {
// λ§μ»€ μΈν°νμ΄μ€μ΄λ―λ‘ λ©μλ μμ
}
μ΄λ κ² νλ©΄ BaseFeature
λ₯Ό ꡬνν ν΄λμ€λ€ μ€μμ SpecialFeature
λ₯Ό ꡬνν ν΄λμ€λ§μ λμμΌλ‘ νΉμ λ‘μ§μ μ μ©ν μ μλ€.
Set μΈν°νμ΄μ€μ λν μκ°
Set μΈν°νμ΄μ€
λ μΌμ’ μ μ μ½μ΄ μλ λ§μ»€ μΈν°νμ΄μ€λ‘ λ³Ό μ μλ€.
Setμ Collectionμ νμ νμ
μλ§ μ μ©ν μ μμΌλ©°, Collectionμ΄ μ μν λ©μλ μΈμλ μλ‘ μΆκ°ν κ²μ΄ μλ€. 보ν΅μ Set μ λ§μ»€ μΈν°νμ΄μ€λ‘ μκ°νμ§ μλλ°, add, equals, hashCode λ± Collection μ λ©μλ λͺ κ°μ κ·μ½μ μ΄μ§ μμ νκΈ° λλ¬Έμ΄λ€. add
, equals
, hashCode
λ±μ λ©μλμ λν λμ κ·μ½μ λ³κ²½νμ¬ μ§ν©(set)μ νΉμ±μ ꡬννλ€. νμ§λ§ λ€μ λ§νμ§λ§ μΆκ°μ μΈ λ©μλλ μ μνμ§ μμλ€.
νμ§λ§ νΉμ μΈν°νμ΄μ€ μ νμ νμ μλ§ μ μ©ν μ μμΌλ©°, μ무 κ·μ½μλ μλμ§ μμ λ§μ»€ μΈν°νμ΄μ€λ μΆ©λΆν μμμ§νλ€. μ΄λ° λ§μ»€ μΈν°νμ΄μ€λ κ°μ²΄μ νΉμ λΆλΆμ λΆ λ³μ(invariant)μΌλ‘ κ·μ νκ±°λ, κ·Έ νμ μ μΈμ€ν΄μ€λ λ€λ₯Έ ν΄λμ€μ νΉμ λ©μλκ° μ²λ¦¬ν μ μλ€λ μ¬μ€μ λͺ μνλ μ©λλ‘ μ¬μ©ν μ μμ κ²μ΄λ€
λ§μ»€ μ λν μ΄μ μ μλ°μ κ°λ ₯ν μ λν μ΄μ νλ‘μΈμ± κΈ°λ₯μ νμ©ν μ μλ€. μ΄λ 리νλ μ (reflection)μ ν΅ν΄ λ°νμμ μ λν μ΄μ μ΄ λ¬λ¦° μμλ₯Ό μ½κ² μ°Ύκ³ μ²λ¦¬ν μ μκ² ν΄μ€λ€.
λν, μ λν μ΄μ μ ν΄λμ€λΏλ§ μλλΌ λ©μλ, νλ, λͺ¨λ, ν¨ν€μ§ λ± λ€μν νλ‘κ·Έλ¨ μμμ μ μ©ν μ μλ€. λ°λΌμ ν΄λμ€μ μΈν°νμ΄μ€ μΈμ μμμ λ§νΉν΄μΌ ν λλ λ§μ»€ μ λν μ΄μ μ μ¬μ©ν μλ°μ μλ€.
- νμ μΌλ‘ νμ©ν΄μΌ νλ κ²½μ°: λ§μ»€ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ€. μ΄λ₯Ό ν΅ν΄ μ»΄νμΌ νμμ νμ 체ν¬λ₯Ό ν μ μκ³ , ν΄λΉ λ§μ»€ μΈν°νμ΄μ€λ₯Ό 맀κ°λ³μλ λ°ν νμ μΌλ‘ μ¬μ©νμ¬ μ½λμ μμ μ±μ λμΌ μ μλ€.
- ν΄λμ€μ μΈν°νμ΄μ€ μΈμ μμμ μ μ©ν΄μΌ νλ κ²½μ°: λ§μ»€ μ λν μ΄μ μ μ¬μ©νλ€. λ©μλλ νλ, λͺ¨λ λ±μ λ§νΉν΄μΌ ν λλ μ λν μ΄μ μ΄ μ μΌν μ νμ§μ΄λ€.
- μ λν μ΄μ μ μ κ·Ή νμ©νλ νλ μμν¬μ ν΅ν©ν΄μΌ νλ κ²½μ°: λ§μ»€ μ λν μ΄μ μ μ¬μ©νλ κ²μ΄ μΌκ΄μ±μ μ μ§νλ λ° λμμ΄ λλ€. μλ₯Ό λ€μ΄, μ€νλ§ νλ μμν¬μμλ λ€μν μ λν μ΄μ μ ν΅ν΄ μ€μ κ³Ό μμ‘΄μ± μ£Όμ μ κ΄λ¦¬νλ―λ‘, λ§μ»€ μ λν μ΄μ μ μ¬μ©νλ κ²μ΄ μ μ νλ€.
// λ§μ»€ μΈν°νμ΄μ€ μ μ
public interface Archivable {
// λ©μλ μμ
}
// Archivableμ ꡬνν ν΄λμ€
public class Document implements Archivable {
private String content;
// κΈ°ν λ©€λ²
}
// Archivableμ ꡬννμ§ μμ ν΄λμ€
public class Image {
private byte[] data;
// κΈ°ν λ©€λ²
}
// Archivable νμ
μ κ°μ²΄λ§μ μ²λ¦¬νλ λ©μλ
public void archive(Archivable item) {
// μμΉ΄μ΄λΈ λ‘μ§
}
μ μ½λμμ archive
λ©μλλ Archivable
μΈν°νμ΄μ€λ₯Ό ꡬνν κ°μ²΄λ§μ μΈμλ‘ λ°λλ€. λ°λΌμ Document
κ°μ²΄λ μ λ¬ν μ μμ§λ§, Image
κ°μ²΄λ μ»΄νμΌ νμμ μ€λ₯κ° λ°μνλ€.
// λ§μ»€ μ λν
μ΄μ
μ μ
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {
}
// μ λν
μ΄μ
μ μ μ©ν λ©μλ
public class Calculator {
@Test
public void testAddition() {
// ν
μ€νΈ μ½λ
}
}
// μ λν
μ΄μ
νλ‘μΈμλ₯Ό ν΅ν΄ @Test μ λν
μ΄μ
μ΄ λ¬λ¦° λ©μλλ₯Ό μ€ν
public class TestRunner {
public static void main(String[] args) {
for (Method m : Calculator.class.getDeclaredMethods()) {
if (m.isAnnotationPresent(Test.class)) {
// ν
μ€νΈ λ©μλ μ€ν λ‘μ§
}
}
}
}
μ μμ μμ @Test
λ§μ»€ μ λν
μ΄μ
μ λ©μλμ μ μ©λλ©°, 리νλ μ
μ ν΅ν΄ ν΄λΉ μ λν
μ΄μ
μ΄ λ¬λ¦° λ©μλλ₯Ό μ°Ύμ μ€νν μ μλ€.
λ§μ»€ μΈν°νμ΄μ€μ λ§μ»€ μ λν μ΄μ μ κ°κ°μ μ₯λ¨μ μ΄ μμΌλ―λ‘ μν©μ λ§κ² μ ννλ κ²μ΄ μ€μ
- μ»΄νμΌ νμ μμ μ±: λ§μ»€ μΈν°νμ΄μ€λ νμ μμ€ν μ νμ©νλ―λ‘, μ»΄νμΌ νμμ μ€λ₯λ₯Ό λ°κ²¬ν μ μλ€. μ΄λ λκ·λͺ¨ νλ‘μ νΈμμ λ§€μ° μ€μνλ©°, λ²κ·Έλ₯Ό μ¬μ μ λ°©μ§ν μ μλ€.
- 리νλ μ λ° λ©νλ°μ΄ν° νμ©: λ§μ»€ μ λν μ΄μ μ λ°νμμ λ©νλ°μ΄ν°λ‘ νμ©ν μ μμ΄, λμ μΈ κΈ°λ₯ ꡬνμ μ 리νλ€. νΉν ν μ€νΈ νλ μμν¬λ DI(Dependency Injection) νλ μμν¬μμ μ μ©νλ€.
- μ μ© λ²μ: λ§μ»€ μΈν°νμ΄μ€λ ν΄λμ€μ μΈν°νμ΄μ€μλ§ μ μ©ν μ μμ§λ§, λ§μ»€ μ λν μ΄μ μ λ λ€μν νλ‘κ·Έλ¨ μμμ μ μ©ν μ μλ€.
- μλμ λͺ νμ±: λ§μ»€ μΈν°νμ΄μ€λ₯Ό ꡬννλ€λ κ²μ ν΄λΉ ν΄λμ€κ° νΉμ νμ μ μΌλΆμμ λͺ μμ μΌλ‘ λνλΈλ€. λ°λ©΄μ λ§μ»€ μ λν μ΄μ μ ν΄λΉ μμκ° νΉμ μμ±μ κ°μ§μ λνλ΄μ§λ§, νμ μΌλ‘μμ μλ―Έλ μλ€..
μ λν μ΄μ κΈ°λ°μ νλ μμν¬λ₯Ό λ§μ΄ μ¬μ©νλ νλμ κ°λ° νκ²½μμλ λ§μ»€ μ λν μ΄μ μ νμ©λκ° λμμ§κ³ μλ€. νμ§λ§ νμ μμ μ±κ³Ό λͺ νν μλλ₯Ό μ λ¬νκΈ° μν΄μλ λ§μ»€ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ λλ μλ€.
μΈμ΄μ νΉμ§κ³Ό κ°λ° λꡬμ λ°μ μ λ°λΌ μ½λ© μ€νμΌκ³Ό ν¨ν΄μ΄ λ³ννμ§λ§, κΈ°λ³Έ μμΉμ λ³νμ§ μλλ€λ κ²μ΄λ€. λ§μ»€ μΈν°νμ΄μ€μ λ§μ»€ μ λν μ΄μ μ κ°κ°μ λͺ©μ κ³Ό μ₯μ μ΄ μμΌλ―λ‘, νλ‘μ νΈμ μꡬ μ¬νκ³Ό νμ μ½λ© 컨벀μ μ λ§κ² μ μ ν νμ©νλ κ²μ΄ μ€μνλ€.
λν, νμ μμ€ν μ μ κ·Ήμ μΌλ‘ νμ©νμ¬ μμ μ μΈ μ½λλ₯Ό μμ±νλ κ²μ μ€μμ±νλ€. νΉν λκ·λͺ¨ μμ€ν μμλ μμ μ€λ₯κ° ν° λ¬Έμ λ‘ μ΄μ΄μ§ μ μμΌλ―λ‘, μ»΄νμΌ νμμ μ‘μ μ μλ μ€λ₯λ μ΅λν κ·Έ λ¨κ³μμ ν΄κ²°νλ κ²μ΄ μ’λ€.
μΆκ°μ μΈ κ³ λ―Ό
- μλ° 8 μ΄νμ κΈ°λ₯κ³Όμ μ‘°ν©: λλ€ ννμμ΄λ μ€νΈλ¦Ό APIμ λ§μ»€ μΈν°νμ΄μ€ λλ λ§μ»€ μ λν μ΄μ μ μ΄λ»κ² μ‘°ν©νμ¬ νμ©ν μ μμμ§ κ³ λ―Όν΄λ³Ό μ μλ€.
- λ€λ₯Έ μΈμ΄μμμ μ μ© μ¬λ‘: μ½νλ¦°μ΄λ μ€μΉΌλΌ κ°μ JVM μΈμ΄μμ λ§μ»€ μΈν°νμ΄μ€μ λ§μ»€ μ λν μ΄μ μ μ΄λ»κ² νμ©λλμ§ λΉκ΅ν΄λ³΄λ κ²λ ν₯λ―Έλ‘μΈ κ² κ°λ€.
- λ―Έλμ λ°©ν₯μ±: μ λν μ΄μ νλ‘μΈμ±κ³Ό 리νλ μ μ μ±λ₯ μ΄μ, κ·Έλ¦¬κ³ λͺ¨λ μμ€ν μ λ°μ μ λ°λΌ λ§μ»€ μΈν°νμ΄μ€μ λ§μ»€ μ λν μ΄μ μ μ¬μ© ν¨ν΄μ΄ μ΄λ»κ² λ³νν μ§ μμΈ‘ν΄λ³΄λ κ²λ μλ―Έ μμ κ²μ΄λ€.
- λ§μ»€ μ λν μ΄μ : ν΄λμ€, λ©μλ, νλ λ±μ μ λν μ΄μ μ λΆμ¬νμ¬ νΉμ μμ±μ λνλΈλ€. μ€νλ§μμλ λΉ μ€μΊλμ΄λ AOP λ±μ νμ©ν λ μ£Όλ‘ μ¬μ©νλ€.
- λ§μ»€ μΈν°νμ΄μ€: λ©μλ μμ΄ μΈν°νμ΄μ€λ₯Ό μ μνκ³ , μ΄λ₯Ό ꡬνν¨μΌλ‘μ¨ ν΄λμ€μ νΉμ νμ μ λΆμ¬νλ€.
μ€νλ§μμλ λ§μ»€ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ κ²½μ°κ° μλμ μΌλ‘ μ μ§λ§, νμμ λ°λΌ νμ©ν μ μλ€. μλ₯Ό λ€μ΄, νΉμ νμ μ λΉλ§μ μ²λ¦¬νκ³ μ ν λ λ§μ»€ μΈν°νμ΄μ€λ₯Ό μ¬μ©ν μ μλ€.
μμ: λ§μ»€ μΈν°νμ΄μ€ μ¬μ©
// λ§μ»€ μΈν°νμ΄μ€ μ μ
public interface SpecialService {
// λ©μλ μμ
}
// λ§μ»€ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€
@Service
public class MySpecialService implements SpecialService {
// ꡬν λ΄μ©
}
// λ§μ»€ μΈν°νμ΄μ€λ₯Ό ꡬννμ§ μμ ν΄λμ€
@Service
public class RegularService {
// ꡬν λ΄μ©
}
νΉμ νμ μ λΉλ§ κ°μ Έμ€κΈ°
@Autowired
private ApplicationContext applicationContext;
public void processSpecialServices() {
// SpecialService νμ
μ λΉλ§ κ°μ Έμ΄
Map<String, SpecialService> beans = applicationContext.getBeansOfType(SpecialService.class);
for (SpecialService service : beans.values()) {
// SpecialServiceλ₯Ό ꡬνν λΉμ λν μ²λ¦¬ λ‘μ§
}
}
μ΄λ κ² νλ©΄ SpecialService
μΈν°νμ΄μ€λ₯Ό ꡬνν λΉλ€λ§μ λμμΌλ‘ λ‘μ§μ μνν μ μλ€.
νμ§λ§ μ€νλ§μμλ λ§μ»€ μΈν°νμ΄μ€λ³΄λ€ λ§μ»€ μ λν μ΄μ μ λ λ§μ΄ μ¬μ©νλ€. μ΄λ μ λν μ΄μ μ΄ λ μ μ°νκ³ , λ€μν νλ‘κ·Έλ¨ μμμ μ μ©ν μ μκΈ° λλ¬Έμ΄λ€.
μμ: λ§μ»€ μ λν μ΄μ μ¬μ©
// λ§μ»€ μ λν
μ΄μ
μ μ
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SpecialComponent {
}
// λ§μ»€ μ λν
μ΄μ
μ μ μ©ν ν΄λμ€
@SpecialComponent
@Service
public class MySpecialService {
// ꡬν λ΄μ©
}
// λ§μ»€ μ λν
μ΄μ
μ μ μ©νμ§ μμ ν΄λμ€
@Service
public class RegularService {
// ꡬν λ΄μ©
}
νΉμ μ λν μ΄μ μ΄ λΆμ λΉλ§ κ°μ Έμ€κΈ°
@Autowired
private ApplicationContext applicationContext;
public void processSpecialComponents() {
// λͺ¨λ λΉ μ΄λ¦ κ°μ Έμ€κΈ°
String[] beanNames = applicationContext.getBeanDefinitionNames();
for (String beanName : beanNames) {
Object bean = applicationContext.getBean(beanName);
// ν΄λμ€μ @SpecialComponent μ λν
μ΄μ
μ΄ λΆμ΄ μλμ§ νμΈ
if (bean.getClass().isAnnotationPresent(SpecialComponent.class)) {
// @SpecialComponentκ° λΆμ λΉμ λν μ²λ¦¬ λ‘μ§
}
}
}
λλ μ€νλ§ μ€μ μμ λΉ μ€μΊλ μ νν°λ§μ ν΅ν΄ νΉμ μ λν μ΄μ μ΄ λΆμ ν΄λμ€λ§ λΉμΌλ‘ λ±λ‘ν μ μλ€.
@Configuration
@ComponentScan(
basePackages = "com.example",
includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = SpecialComponent.class)
)
public class AppConfig {
}
- λ§μ»€ μΈν°νμ΄μ€
- μ»΄νμΌ νμμ νμ μ²΄ν¬ κ°λ₯
- νΉμ νμ μ λΉλ§ μ£Όμ λ°μ μ μμ
- μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ νλ―λ‘, ν΄λμ€κ° μ΄λ―Έ λ€λ₯Έ ν΄λμ€λ₯Ό μμνκ³ μλ€λ©΄ λ€μ€ μμμ΄ λΆκ°λ₯ν μλ°μ νΉμ±μ μ νμ΄ μμ
- λ§μ»€ μ λν
μ΄μ
- ν΄λμ€ μΈμλ λ©μλ, νλ λ±μ μ μ© κ°λ₯
- 리νλ μ μ ν΅ν΄ λ°νμμ λ€μν μ²λ¦¬κ° κ°λ₯
- μ€νλ§μ λΉ μ€μΊλ, AOP λ±κ³Όμ μ°λμ΄ μ©μ΄
μ€νλ§μμ νΉμ λΉμ μλ³νκ±°λ μ²λ¦¬νκΈ° μν΄μλ λ§μ»€ μ λν μ΄μ μ μ¬μ©νλ κ²μ΄ λ μΌλ°μ μ΄λ©° νΈλ¦¬νλ€. λ§μ»€ μΈν°νμ΄μ€λ μ»΄νμΌ νμ νμ μ²΄ν¬ λ±μ μ₯μ μ΄ μμ§λ§, μ€νλ§μ κΈ°λ₯κ³Ό κ²°ν©νμ¬ μ¬μ©νκΈ°μλ λ§μ»€ μ λν μ΄μ μ΄ λ μ ν©νλ€.
λ°λΌμ μ κ° μ΄μ μ μ μν μμλ λ§μ»€ μΈν°νμ΄μ€λ³΄λ€λ λ§μ»€ μ λν μ΄μ μ νμ©ν μμμ΄λ©°, μ€νλ§μμλ μ΄λ¬ν λ°©μμ ν΅ν΄ νΉμ ν΄λμ€λ₯Ό μλ³νκ³ μ²λ¦¬νλ€.
- λ§μ»€ μΈν°νμ΄μ€μ μ¬μ© μ ν
- λ§μ»€ μΈν°νμ΄μ€λ ν΄λμ€μλ§ μ μ© κ°λ₯νλ©°, μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ νλ―λ‘ λ€μ€ μμμ μ μ½μ΄ μλ€.
- μ€νλ§μμ λΉμΌλ‘ λ±λ‘ν λλ ν΄λμ€ν¨μ€ μ€μΊλμ ν΅ν΄ μ λν μ΄μ κΈ°λ°μΌλ‘ μ²λ¦¬νλ κ²½μ°κ° λ§λ€.
- λ§μ»€ μ λν
μ΄μ
μ μ₯μ
- λ€μν νλ‘κ·Έλ¨ μμμ μ μ© κ°λ₯
- AOP λ±μ κΈ°λ₯κ³Ό κ²°ν©νμ¬ λΆκ°μ μΈ μ²λ¦¬λ₯Ό μ½κ² μΆκ°ν μ μμ
- λ©νλ°μ΄ν°λ‘ νμ©λμ΄ νλ μμν¬μμ ν΅ν©μ μ©μ΄
νλͺ© | λ§μ»€ μΈν°νμ΄μ€ | μ€νλ§μ Service/ServiceImpl |
---|---|---|
λͺ©μ | ν΄λμ€μ νΉμ μμ± λΆμ¬ | λΉμ¦λμ€ λ‘μ§μ μ μμ ꡬν λΆλ¦¬ |
λ©μλ μ‘΄μ¬ μ¬λΆ | λ©μλ μμ | μΈν°νμ΄μ€μ λ©μλ μκ·Έλμ² μ μ |
μ¬μ© λ°©μ | μΈν°νμ΄μ€ ꡬνμΌλ‘ νμ μ§μ | μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ λ‘μ§ κ΅¬ν |
μμ | Serializable , Cloneable |
UserService , UserServiceImpl |
μΆμ² λ° μ°Έκ³