Entity 실제 DB의 테이블과 매핑되는 객체이다. id로 Entity를 구분한다. public class Member { private final String id; private final String name; public Member(String id, String name) { this.id = id; this.name = name; } } DTO(Data Transfer Object) 계층(Layer)간 데이터 교환을 위해 사용하는 객체이다. 데이터 교환만을 위해 사용한다. 로직을 갖지 않고, getter()/setter()만 갖는다. public class MemberDto { private String id; private String name; public MemberDto(String..
본문 요약 분류 DDD 설계 SQL 중심 설계 개념 도메인을 중심으로 설계해 나아가는 방법 데이터 중심으로 설계해 나아가는 방법 특징 1. 도메인의 개념을 먼저 정의하고 구현한다. 2. 각각의 도메인이 철저히 분리돼 변경과 확장에 용이하다. 3. 도메인의 복잡성 해결에 힘쓴다. 4. 개발자와 도메인 전문가의 협업을 통해 커뮤니케이션 문제를 해결한다. 1. 관계형 데이터베이스의 테이블을 먼저 만들고 엔티티를 설계한다. 2. 도메인 변경 시 RDB의 테이블과 쿼리도 모두 수정해야 한다. 3. 데이터베이스의 효율성과 최적화를 중요시한다. 4. 협업을 고려하지 않은 개발자 위주의 용어 선택으로 커뮤니케이션 문제를 야기할 수 있다. 차이점 1. 도메인 중심의 설계 2. 객체지향적 3. 도메인과 데이터의 느슨한 결..
DI란? 의존성 주입(Dependency Injection, DI) 스프링 컨테이너가 필요한 객체를 제공(주입)해준다. 의존성 주입 방법 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 어노테이션 @Autowired @Resource @Inject IoC란? 제어의 역전(Inversion of Control, IoC) 개발자가 객체를 직접 생성하거나 제어하는 것이 아닌 스프링 컨테이너에서 관리하고 제공하는 객체를 가져와 사용하는 것을 말한다. // 개발자가 직접 Dog 객체 생성 public class Animal { Dog dog = new Dog(); } // 개발자가 직접 Dog 객체를 생성하는 게 아닌 그냥 객체를 선언하기만 함 public class Animal { pr..
오버라이딩이란? 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것 부모 클래스의 메서드 선언부와 같아야 한다. 오버라이딩하면 기존과 다른 기능으로 구현할 수 있다. 자동 타입 변환되면 부모 클래스나 인터페이스의 메서드가 호출되지만, 오버라이딩된 메서드가 있으면 오버라이딩된 메서드가 호출된다. @Override 기재는 필수일까? 컴파일 시 강력한 체크를 위해 어노테이션을 기재하는 게 좋다고 생각한다. 하지만 어노테이션을 기재하지 않아도 코드는 실행된다. 코드 상 오류가 있을 때, 컴파일 에러 없이 의도와 다르게 실행되는 건 함정...😨 코드로 살펴보기 @Override ❌ 아래 예시의 본래 의도는 Child 클래스의 오버라이딩한 hello()를 호출하는 것이다. 하지만 매개 변수 String name의..
인터페이스가 가지고 있는 객체 지향의 특징 캡슐화, 추상화, 다형성, 상속성 모두를 가지고 있다고 생각한다. Why? 캡슐화 인터페이스를 구현한 구현 객체를 통해 필드와 메서드를 캡슐화할 수 있다. 추상화 공통적인 속성을 뽑아 인터페이스의 추상 메서드로 표현하고, 구체적인 속성은 구현 클래스에서 추상 메서드를 오버라이딩해서 구현할 수 있다. 다형성 인터페이스를 구현한 구현 객체는 인터페이스 타입으로 자동 타입 변환할 수 있기 때문에 다양한 결과를 만들 수 있다. 상속성 인터페이스는 extends 할 수 있다. 추상 클래스와는 다르게 다중으로 상속이 가능하다. 인터페이스와 인터페이스를 구현하는 구현 클래스 관계 자체가 상속 관계라 볼 수 있다.
객체 지향의 4가지 특징 캡슐화 객체의 필드와 메서드를 은닉하는 것 불필요한 접근을 방지할 수 있다. 데이터의 잘못된 변경을 방지할 수 있다. public class Person { private String name; private int age; public Person(String name, int age) { if(name != null) { this.name = name; } if(age >= 0) { this.age = age; } } public void eat() { System.out.prinlt("음식을 먹다."); } public void sleep() { System.out.prinln("잠을 자다."); } } 추상화 공통적인 것을 뽑아낸 것 ex) 소리를 내다(추상적) 꽥꽥 소리..