이번 포스트에서 다룰 내용은 Qualifier 어노테이션입니다. 이름 그대로 객체를 식별해주는 어노테이션입니다. @Named Qualifer Dagger는 의존성 주입을 요청했을 때 Module에 선언된 자료형(Type)과 동일한 객체를 주입해줍니다. 따라서, Module에 동일한 Type의 객체가 여러개 선언되어 있을 경우, 컴파일 타임에 에러를 발생하게 됩니다. 의존성주입은 Interface를 기반으로하는 코드를 권장하므로, 같은 부모를 가진 여러 Child 클래스가 존재할 가능성이 매우 높습니다. 이러한 경우를 위해서 @Named 어노테이션을 통해서 같은 타입의 여러 객체를 선언하고 주입해줄 수 있습니다. 사용법은 간단합니다. Module의 @Provides어노테이션과 @Injection 어노테이..
Lazy 혹은 Provider를 사용하면 의존성 주입의 시점을 늦추거나 항상 새로운 객체를 반환 받을 수 있도록 할 수있습니다. Lazy Injection vs Provider Injection Cpu 객체는 Provider를 통해 주입해주고, Ram 객체는 Lazy를 통해 주입해주도록 해주겠습니다. ComputerComponent.kt @Component(modules = [ComputerModule::class]) interface ComputerComponent { fun inject(computer: Computer) @Component.Builder interface Builder { fun computerModule(computerModule: ComputerModule): Builder fu..
Dagger란? Dagger는 자바 안드로이드에서 사용 가능한 정적 컴파일타임 의존성주입 프레임워크 입니다. Annotation Proccessor를 통해 컴파일 타임에 어노테이션을 읽고 의존성 주입에 필요한 클래스들을 생성합니다. 어노테이션 처리를 컴파일 시점에 별도의 프로세서에서 처리하므로 성능이 향상되고, 클래스 Reflection을 사용하지 않으므로 Runtime Exception 발생을 막으며 Proguard 설정의 번거로움에서 벗어날 수 있습니다. Module Module에서 하는 역할은 @Provides,@Binds를 통해 주입할 클래스의 인스턴스를 생성합니다. 메소드의 반환 타입을 통해서 주입할 객체를 정하며, 반환타입이 같을 경우 @Qualifier를 통해 주입할 객체를 지정할 수 있습니..
이번 포스트에서는 Flutter의 상태 관리가 필요한 이유와 효율적으로 관리하기 위해 상태 관리 라이브러리를 사용해야 하는 이유에 대해 알아보겠습니다. Flutter의 상태 관리 Flutter를 이용해서 앱을 만들 때 상태 관리(State Management)가 왜 중요한가에 대해 먼저 생각해볼 필요가 있습니다. Win32, Android, iOS 등 기존에 사용하던 프레임워크들에서 명령형 UI 프로그래밍 방식을 사용했었습니다. (but, 지금은 선언형으로 넘어가는 추세) 이러한 명령형 UI 프로그래밍 방식은 UI 엔티티를 수동으로 작성하여 UI를 변경할 수 있는 메소드 혹은 setter 메소드를 호출해서 수동으로 변경하였습니다.(예를 들면, textView.setText) 하지만, Flutter의 UI..
MVC, MVP, MVVM은 모두 소프트웨어 개발에서 사용되는 디자인 패턴으로, 애플리케이션의 구조와 역할을 분리하여 코드를 더 잘 구성하고 유지보수성을 높이기 위해 고안된 패턴들입니다. 이번 포스트에서는 각 패턴의 주요 차이점과 특징들을 정리하겠습니다. MVC 패턴 MVC패턴은 View와 Model 사이의 중개자 역할을 수행하는 Controller를 두는 패턴입니다. 이를 통해서 View는 사용자 인터페이스에 집중할 수 있고, Model은 데이터와 비즈니스 로직에 집중할 수 있게 해줍니다. MVC 패턴은 Model, View, Controller 세 부분으로 나눕니다. MVC의 각각의 세 부분은 다음과 같은 역할을 합니다. Model -> Model은 데이터와 비즈니스 로직을 담당합니다. View -..
Dependency Injection이란? 의존성 : A클래스가 B클래스에 대한 참조가 있을 경우 A는 B에 의존한다라고 하고 B는 A에 대한 종속성이 있다(종속한다)라고 합니다. 이 의존성을 잘 관리하지 않으면, 프로젝트의 규모가 커질수록 코드변화에 유연하게 대처할 수 없어서 많은 코드 수정을 하게 될 수도 있습니다. SOLID DIP(Dependency Inversion Principle) A. HIGH LEVEL MODULES SHOULD NOT DEPEND UPON LOW LEVEL MODULES. BOTH SHOULD DEPEND UPON ABSTRACTIONS. B. ABSTRACTIONS SHOULD NOT DEPEND UPON DETAILS. DETAILS SHOULD DEPEND UPON..
기존의 Material Buttons(FlatButton, RaisedButton, OutlineButton)들이 Deprecated 되었습니다. 대신 새로운 MaterialButton들을 사용해야 합니다. 새로운 Material Button들(TextButton, ElevatedButton, OutlinedButton)의 탄생 목적은 생성자 매개 변수와 테마를 통해 버튼을보다 유연하고 쉽게 구성하는 것이 목표입니다. 기존 버튼들은 각각 스타일을 변경해주어야 했지만 이제는 ButtonStyle 단일개체를 변경시켜주면 됩니다. ButtonStyle's Constructor import 'package:flutter/material.dart'; ButtonStyle({ MaterialStateProperty..
레이아웃에서 뷰의 크기와 위치를 설정할 때는 px보다는 dp를 이용하는 것이 좋다. 왜냐하면 dp를 사용하면 큰 화면, 작은 화면에 상관 없이 동일한 비율로 나타내준다. 하지만 자바코드에서는 dp를 사용할 수 없다. 픽셀 값만 인자로 받기도 하지만 가장 큰 이유는 자바 코드에서는 실행하는 기기의 해상도를 모르므로 런타임 시에 해상도에 맞게 dp를 px로 변환하여 사용한다. val resources = resources val px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200f, resources.displayMetrics) 200dp를 px로 변환하려면 위에 코드처럼 변환하여 setMargins()나 setWidth()등에 넣어주면 된다.
풀이1. SET @hour := -1; SELECT (@hour := @hour + 1) AS HOUR, (SELECT Count(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) AS COUNT FROM ANIMAL_OUTS WHERE @hour < 23 풀이2. WITH RECURSIVE HOUR AS( SELECT 0 AS h UNION ALL SELECT h+1 FROM HOUR WHERE h