코드스테이츠 Day47
- 오전 데일리 코딩
부분 집합을 담는 부분에서 답이 아닌 건 알았고, 뭔가 스택같은 자료구조를 써야한다는 느낌은 왔으나, 어떻게 해야할지 모르겠어서 결국 못 풀었다.
저렇게 돌리면 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;
}
}
- Spring Data JDBC 기반의 도메인 엔티티 및 테이블 설계
- DDD(Domain Driven Design) : 도메인 주도 설계
- 도메인 : 비지니스 업무 영역
- 애그리거트(Aggregate) : 연관된 업무(도메인)를 그룹으로 묶은 것
- 애그리거트 루트(Aggregate Root) : 해당 애그리거트를 대표하는 도메인으로, 다른 도메인들과 직간접적으로 연관되며, 애그리거트 루트 entity의 PK가 다른 도메인들의 FK가 됨
- 애그리거트 관계, 엔티티 클래스 관계, DB table 설계가 중요.
- 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
-
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 메서드를 구현)
<느낀 점>
오늘 양도 많고 내용도 복잡했는데, 블로그에 정리하면서 한 번 더 보니까 조금 더 이해가 된다.
주말이나 월요일에 코드를 다시 처음부터 정독해봐야겠다. 세 번째 보면 좀 더 낫겠지.
월요일 실습을 무사히 해낼 수 있으면 좋겠다.