2022.12.23.FRI

ronglong·2022년 12월 23일
0

코드스테이츠 Day47

  1. 오전 데일리 코딩
    부분 집합을 담는 부분에서 답이 아닌 건 알았고, 뭔가 스택같은 자료구조를 써야한다는 느낌은 왔으나, 어떻게 해야할지 모르겠어서 결국 못 풀었다.
    저렇게 돌리면 3/5 통과하는데, 의미있는 숫자는 아니다.
    레퍼런스 열었는데 함수를 3개나 만들어서 쓰길래 일단 닫아둠..
    다음주 월요일에 봐봐야겠다.
public class Solution { 
	public ArrayList<String> powerSet(String str) {
		// 필드 변수를 사용하면 테스트가 정상적으로 작동하지 않습니다.
		// 메서드 내부에서 값을 저장하고 활용해주세요.
    
    //str 쪼개서 넣을 리스트
    List<String> list = new ArrayList<>(); 

    // 중복된 문자 빼고 넣기
    for(int i=0; i<str.length(); i++){
      if(!list.contains(String.valueOf(str.charAt(i)))) list.add(String.valueOf(str.charAt(i)));
    } 

    //정렬
    Collections.sort(list); 

    //결과값 담을 리스트
    ArrayList<String> result = new ArrayList<>();
    result.add("");

    //부분 집합
    for(int i=0; i<list.size(); i++){
      String element = list.get(i); //a //b //c
      result.add(element);
      for(int j=i+1; j<list.size(); j++){
        element += list.get(j); //ab abc //bc 
        result.add(element);
      }
    }

    return result;
	}
}
  1. Spring Data JDBC 기반의 도메인 엔티티 및 테이블 설계
  • DDD(Domain Driven Design) : 도메인 주도 설계
  • 도메인 : 비지니스 업무 영역
  • 애그리거트(Aggregate) : 연관된 업무(도메인)를 그룹으로 묶은 것
  • 애그리거트 루트(Aggregate Root) : 해당 애그리거트를 대표하는 도메인으로, 다른 도메인들과 직간접적으로 연관되며, 애그리거트 루트 entity의 PK가 다른 도메인들의 FK가 됨
  • 애그리거트 관계, 엔티티 클래스 관계, DB table 설계가 중요.
  1. Spring Data JDBC를 통한 데이터 액세스 계층 구현 - 도메인 엔티티 클래스 정의
  • 테이블 - 외래키(Foreign key) / 클래스 - 객체 참조 리스트(List)
  • 애그리거트 객체 매핑 규칙
    1) 모든 엔티티 객체의 상태는 애그리거트 루트를 통해서만 변경 가능
    -> 규칙 검사를 통해 도메인 규칙의 일관성을 유지하기 위해
    2) 같은 애그리거트 내에서는 엔티티 간에 객체로 참조
    3) 애그리거트 루트 간의 참조는 객체 참조 대신에 ID로 참조
    AggregateReference<Member, Long> memberId;
  • @Id 애너테이션을 엔티티의 멤버 변수에 붙여서 식별자로 구분하여 Entity와 DB table을 매핑
  • @MappedCollection(idColumn = "", keyColumn = "")
    1:N 관계 중 N table에서 참조하는 FK 컬럼명 = idColumn, PK 컬럼명 = keyColumn
  1. Spring Data JDBC를 통한 데이터 액세스 계층 구현 - 서비스, 리포지토리 구현

    1) 리포지토리(Repository) 인터페이스 정의

    • CrudRepository 인터페이스를 상속하면 CrudRepository에서 제공하는 CRUD 메서드를 사용 가능
    • Spring Data JDBC에서 지원하는 쿼리 메서드(Query Method)
      • find+By+ SQL 쿼리문에서 WHERE 절의 컬럼명 + (WHERE 절의 조건 데이터)
      • 컬럼명 = 엔티티 클래스의 멤버 변수명. (테이블 컬럼명x)
      • Spring Data JDBC에서는 리턴값을 Optional로 래핑 가능
      • Optional< Member > findByEmail(String email);
    • 복잡한 쿼리문의 경우, @Query 애너테이션 통해서 직접 쿼리문 작성 가능

    2) 서비스(Service) 클래스 구현

    • Spring Data JDBC에서 내부적으로 MemberRepository 인터페이스의 구현 클래스 객체를 생성
    • Controller class의 handler method에 대응하는 메서드 작성(구현)
    • 리소스를 DB에 Insert할 경우 이미 Insert된 리소스인지 검증하는 로직이 필요
      -> 검증 메서드를 별도의 로직으로 추출하여 작성 (Optional 이용)
    • Optional.ofNullable() 로 null값을 허용하여, 클라이언트가 선택적 수정 가능
      Optional< Member > member = memberRepository.findByEmail(email);
    • delete의 경우, 테이블의 데이터 자체를 삭제하기 보다는 MEMBER_STATUS 같은 컬럼을 두어 상태 값만 변경

    3) 기타 class 수정

    • Dto class
    • Controller class (URI 객체 생성 등)
    • Mapper interface
    • ExceptionCode class
      ...
      복잡한 DTO - Entity 매핑은 Mapper 인터페이스에 개발자가 직접 매핑 로직을 작성(default 메서드를 구현)

<느낀 점>
오늘 양도 많고 내용도 복잡했는데, 블로그에 정리하면서 한 번 더 보니까 조금 더 이해가 된다.
주말이나 월요일에 코드를 다시 처음부터 정독해봐야겠다. 세 번째 보면 좀 더 낫겠지.
월요일 실습을 무사히 해낼 수 있으면 좋겠다.

0개의 댓글