☕ JPA Repository & 🐦 Dart 문법 정리
🧩 [ JPA (Java Persistence API) ]
⚙️ [ JPA Repository ]
- JPA는 기본 CRUD 작업과 동적 쿼리 기능을 제공하는 인터페이스를 제공한다.
📘 사용법
- Repository 인터페이스 생성
extends JpaRepository<T, ID>
- T : 조작할 Entity 클래스명
- ID : 조작할 Entity의 PK 자료형 (기본자료형 불가능, 래퍼클래스 사용)
- 인터페이스에
@Repository 주입
🧾 예시 코드
@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> { }
🧱 [ JPA 기본 함수 ]
| 기능 | 메서드 | 설명 |
|---|
| C (등록) | .save(저장할Entity) | PK가 없으면 INSERT, 있으면 UPDATE |
| R (조회) | .findAll(), .findById() | 전체 / 특정 Entity 조회 (Optional 반환) |
| U (수정) | .save() or @Transactional 내 setter() | JPA의 영속성으로 자동 감지 |
| D (삭제) | .deleteById() | 특정 Entity 삭제 |
💡 수정 메서드는 별도로 존재하지 않음.
save() 또는 영속 상태의 Entity에서 setter() 호출로 수정된다.
🧩 [ Entity 사용 규칙 ]
Entity는 Service 계층에서만 사용하는 것이 권장된다.
- 따라서 Entity ↔ Dto 변환 메서드를 별도로 정의해야 한다.
🧠 [ Optional 클래스 ]
| 메서드 | 설명 |
|---|
.isPresent() | 값이 존재하면 true, 없으면 false |
.get() | 값이 존재할 때 해당 객체 반환 |
.orElse(value) | 값이 없을 경우 기본값 반환 |
.orElseThrow(exception) | 값이 없을 경우 예외 발생 |
📘 예시 코드
Optional<UserEntity> user = userRepository.findById(1L);
if(user.isPresent()) {
return user.get();
} else {
return new UserEntity();
}
⚙️ [ JPA 사용법 & 설정 ]
| 설정 항목 | 설명 |
|---|
| Auto Increment 설정 | @EnableJpaAuditing + @GeneratedValue(strategy = GenerationType.IDENTITY) |
| Auditing 활성화 | @EntityListeners(AuditingEntityListener.class) 추가 |
| 테이블명 지정 | @Table(name = "table_name") |
| 컬럼 속성 정의 | @Column(name = "", nullable = false, length = 100) |
| 전체 속성 커스텀 | @Column(columnDefinition = "TEXT") |
| 자동 날짜 주입 | @CreatedDate, @LastModifiedDate |
🐦 [ Dart & Flutter 기본 문법 ]
📘 [ 기본 문법 ]
| 분류 | 문법 | 설명 |
|---|
| 정수 | int | 정수형 데이터 |
| 실수 | double | 부동소수점 데이터 |
| 논리 | bool | 참/거짓 |
| 문자열 | String | 문자열 데이터 |
🧱 주요 변수 & 상수
| 키워드 | 설명 |
|---|
var | 자동 타입 추론 |
dynamic | 자동 타입 추론 + 타입 변경 가능 (Java의 Object 유사) |
const | 런타임 상수 (컴파일 이후 불변) |
final | 컴파일 시점 상수 (런타임 계산 가능) |
String? | null 값을 허용하는 타입 |
📘 예시 코드
var name = "Alice";
dynamic age = 25;
const pi = 3.14;
final now = DateTime.now();
String? nickname;
| 항목 | 설명 |
|---|
| 정의 | 상태가 없는 위젯 (리렌더링 불필요) |
| 사용 시점 | 단순 UI, 데이터 변경 없음 |
| 상속 | extends StatelessWidget |
| 리턴 구조 | MaterialApp → Scaffold → Widget |
📘 예시 코드
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Stateless Example')),
body: Center(child: Text('Hello World!')),
),
);
}
}
| 항목 | 설명 |
|---|
| 정의 | 상태 변화가 필요한 위젯 |
| 비교 | React의 useState와 유사 |
| 상속 | extends StatefulWidget |
| 상태 관리 | 내부 클래스가 State<상위위젯>을 상속 |
📘 예시 코드
class CounterApp extends StatefulWidget {
@override
State<CounterApp> createState() => _CounterState();
}
class _CounterState extends State<CounterApp> {
int count = 0;
void increment() {
setState(() {
count++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Stateful Example')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Count: $count'),
ElevatedButton(onPressed: increment, child: Text('Add')),
],
),
),
);
}
}
💡 Flutter의 setState()는 React와 달리 여러 상태를 한 번에 관리할 수 있다.
🧠 [ TextField ]
| 항목 | 설명 |
|---|
| 정의 | 사용자 입력을 받는 위젯 (input 역할) |
| 제어 변수 | TextEditingController 사용 |
| 값 반환 | controller.text |
📘 예시 코드
final TextEditingController nameController = TextEditingController();
TextField(
controller: nameController,
decoration: InputDecoration(labelText: "이름 입력"),
);