2025년 11월 4일 화요일 (107일차)

Jeonghoon·2025년 11월 4일

jeonghoon's Study

목록 보기
110/128

☕ JPA Repository & 🐦 Dart 문법 정리


🧩 [ JPA (Java Persistence API) ]


⚙️ [ JPA Repository ]

  • JPA는 기본 CRUD 작업과 동적 쿼리 기능을 제공하는 인터페이스를 제공한다.

📘 사용법

  1. Repository 인터페이스 생성
  2. extends JpaRepository<T, ID>
    • T : 조작할 Entity 클래스명
    • ID : 조작할 Entity의 PK 자료형 (기본자료형 불가능, 래퍼클래스 사용)
  3. 인터페이스에 @Repository 주입

🧾 예시 코드

@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> { }

🧱 [ JPA 기본 함수 ]

기능메서드설명
C (등록).save(저장할Entity)PK가 없으면 INSERT, 있으면 UPDATE
R (조회).findAll(), .findById()전체 / 특정 Entity 조회 (Optional 반환)
U (수정).save() or @Transactionalsetter()JPA의 영속성으로 자동 감지
D (삭제).deleteById()특정 Entity 삭제

💡 수정 메서드는 별도로 존재하지 않음.
save() 또는 영속 상태의 Entity에서 setter() 호출로 수정된다.


🧩 [ Entity 사용 규칙 ]

  • EntityService 계층에서만 사용하는 것이 권장된다.
  • 따라서 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; // null 가능 변수

🧩 [ StatelessWidget ]

항목설명
정의상태가 없는 위젯 (리렌더링 불필요)
사용 시점단순 UI, 데이터 변경 없음
상속extends StatelessWidget
리턴 구조MaterialApp → Scaffold → Widget

📘 예시 코드

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Stateless Example')),
        body: Center(child: Text('Hello World!')),
      ),
    );
  }
}

🔁 [ StatefulWidget ]

항목설명
정의상태 변화가 필요한 위젯
비교React의 useState와 유사
상속extends StatefulWidget
상태 관리내부 클래스가 State<상위위젯>을 상속

📘 예시 코드

class CounterApp extends StatefulWidget {
  
  State<CounterApp> createState() => _CounterState();
}

class _CounterState extends State<CounterApp> {
  int count = 0;

  void increment() {
    setState(() {
      count++;
    });
  }

  
  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: "이름 입력"),
);

0개의 댓글