| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- riverpod
- 배포
- ListView
- DART
- JS
- 자바 포맷 출력
- printf
- npm
- scss
- Flutter
- nodejs
- 앱심사
- abap
- 단축키
- UI/UX
- unity
- 엡
- 자바스크립트
- println
- java 출력
- java
- Clean Architecture
- lifecycle
- LLM
- java 콘솔 출력 차이
- 자바 출력 방식
- firebase
- react
- JQ
- develop
- Today
- Total
guricode
[클린아키텍쳐]Clean Architecture -1 본문
클린아키텍쳐는 Robert C. Martin (SOLID - 객체지향 설계 원칙의 창시자)라는 SW 엔지니어가 제시한 개념이다
소프트웨어를 관심사에 따라 계층으로 분리해서 개발하는 방식인데

데이터 흐름은 이미지와 같이 진행된다
각각 계층이 수정돼도 서로 영향을 받지 않기 때문에 유지보수가 용이하다는 장점이 있고 의존성이 단방향이기 때문에 Mocking데이터를 만들어 테스트에도 용이하다.
이 개념을 플러터에 적용해볼것이다.

Presintation Layer는 뷰,Domain Layer는 엔티티, Data Layer는 Data Source와 Repository로 구성돼어있다
이 개념을 클릭아키텍쳐로 수정하자면

의존하고 있는 부분에 Repository를 두어서 의존성이 단방향으로 흐르게 한다.
사실 아직 완벽하게 이해는 하지못하고 감으로 아는 부분이다.
여기서 DTO는 DataTransferobkect의 약자로 한글로 직역하자면 데이터변환객체? 가 된다
DataSource에서 Entity에 의존하지 않게 구현한다
일단 연습으로는 서버와 통신하지 않고 Json파일을 불러와서 실습해본다.
//Movie_Dto.dart
영화 정보 json을 변환해주는 Dto다.
// "title": "The Wolf of Wall Street",
// "released": "25 Dec 2013",
// "runtime": "180 min",
// "director": "Martin Scorsese",
// "actors": "Leonardo DiCaprio, Jonah Hill, Margot Robbie, Matthew McConaughey",
// "poster": "https://ia.media-imdb.com/images/M/MV5BMjIxMjgxNTk0MF5BMl5BanBnXkFtZTgwNjIyOTg2MDE@._V1_SX300.jpg"
class MovieDto {
final String title;
final String released;
final String runtime;
final String director;
final String actors;
final String poster;
//생성자 호출해서 값 초기화,기본생성자
MovieDto({
required this.title,
required this.released,
required this.runtime,
required this.director,
required this.actors,
required this.poster,
});
//클래스명.이름 형태로 새로운 생성자를 정의
//Map<String, dynamic> 형태의 json 데이터를 받아서 MovieDto 인스턴스로 만드는 네임드 생성자
MovieDto.fromJson(Map<String, dynamic> map)
: this(
title: map['title'],
released: map['released'],
runtime: map['runtime'],
director: map['director'],
actors: map['actors'],
poster: map['poster'],
);
//객체를 json으로 변환한다.//DTO만들었으면 테스트폴더에서 테스트 진행
Map<String, dynamic> toJson() {
return {
'title': title,
'released': released,
'runtime': runtime,
'director': director,
'actors': actors,
'poster': poster,
};
}
}
Dto를 만들었으니 이 Dto메서드가 잘 작동하는지 테스트 해야한다
test폴더에 movie_dto_test.dart를 생성해서 Mockdata를 만든 후 테스트를 해본다
// movie_dto_test.dart
import 'dart:convert';
import 'package:flutter_clean_arch/data/dto/movie_dto.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
test('MovieDto : fromJson test', () {
const sampleJsonStirng = """
{
"title": "The Avengers",
"released": "04 May 2012",
"runtime": "143 min",
"director": "Joss Whedon",
"actors": "Robert Downey Jr., Chris Evans, Mark Ruffalo, Chris Hemsworth",
"poster": "https://ia.media-imdb.com/images/M/MV5BMTk2NTI1MTU4N15BMl5BanBnXkFtZTcwODg0OTY0Nw@@._V1_SX300.jpg"
}
""";
//샘플데이터를 json으로 변환
final map = jsonDecode(sampleJsonStirng);
//fromjson으로 MovieDto인스턴스 생성
final movieDto = MovieDto.fromJson(map);
expect(movieDto.title, "The Avengers");
expect(movieDto.released, "04 May 2012");
expect(movieDto.runtime, "143 min");
expect(movieDto.director, "Joss Whedon");
expect(
movieDto.actors,
"Robert Downey Jr., Chris Evans, Mark Ruffalo, Chris Hemsworth",
);
expect(
movieDto.poster,
"https://ia.media-imdb.com/images/M/MV5BMTk2NTI1MTU4N15BMl5BanBnXkFtZTcwODg0OTY0Nw@@._V1_SX300.jpg",
);
});
}
임의의 영화 json하나를 골라 mock으로 사용했다
Dto가 정상작동한다면 테스트는 통과되어야한다
'앱 > Flutter&Dart' 카테고리의 다른 글
| [클린아키텍쳐]Clean Architecture -3 (0) | 2025.08.30 |
|---|---|
| [클린아키텍쳐]Clean Architecture -2 (1) | 2025.08.30 |
| CICD 관련 메모 (0) | 2025.08.29 |
| [영화정보앱 만들기-2] [트러블 슈팅] Dio 인터셉터 handler.next 누락으로 요청 영구 대기 (4) | 2025.08.27 |
| [영화정보앱 만들기] 의존성 설정,dotenv (2) | 2025.08.26 |