목록전체 글 (104)
Java / Spring
@Transactional 이란?트랜잭션의 뜻을 이름 그대로 번역하면 '거래' 라는 뜻이다.즉, 스프링어플리케이션 환경에 이 의미를 적용하면 하나의 거래를 안전하게 처리하도록 보장한다는 뜻으로 볼 수 있다. 트랜잭션 ACID 란?트랜잭션은 4가지의 특성이 존재한다. 1. 원자성 (Atomicity)- 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것 처럼 모두 성공하거나 모두 실패해야한다. 예를 들어 아래와 같은 요구사항이 존재한다고 가정한다.모임앱과 같은 환경에서 사용자가 모임 일정 생성하는 API 를 요청하면 동시에 - DB에 Event 저장- 참여자에게 알림 (Notification) 생성- 참석자 초기 데이터 생성 만약, 원자성이 깨지면 일정은 생성되지만 알림은 전송되지 않고, 참석자 초기..
목적명령어디버그 실행flutter run특정 기기로 실행flutter run -d device_id모듈 재시작 (State 유지)r전체 hot restart (State 초기화)R빌드(Android APK)flutter build apk빌드(Android Release)flutter build apk --release빌드(iOS Release)flutter build ios --release캐시 정리(버그 해결용)flutter cleanFlutter SDK 재설정flutter pub get의존성 업데이트flutter pub upgrade
dispose() 가 필요한 이유:- 입력 값에 대한 변수를 생성할 때 TextEditingController() 와 같은 함수를 호출해서 입력할 변수 데이터에 초기화 시키는 경우- TextEditingController 는 단순한 값 저장 변수가 아니라 Stream 내부에서 키 입력 이벤트를 구독하는 리스너와 같은 리소스를 사용한다. StatefulWidget 이 화면에서 사라져도 이 컨트롤러가 계속 메모리에 남아 있으면, 사용하지 않는 리소스를 계속 점유하게 되어 메모리 누수나 예상치 못한 동작이 생길 수 있기 때문에 dispose() 를 통해 내부 리소스를 해제해 줘야 한다. dispose() 를 명시적으로 오버라이드 해야 하는 경우1. Controller 관련 이벤트 선언 시TextEditingC..
super.key 란?class DialogUI extends StatelessWidget { const DialogUI({super.key, this.state, this.state2}); final state; final state2; StatelessWidget 이나 StatefulWidget 의 부모 클래스인 Widget 은 key? key 를 생성한다.{super.key} 는 현재 클래스의 생성자가 부모 클래스의 생성자에게 key 를 전달한다는 의미이다. 이 key는 위젯이 리빌드될 때 기존 위젯과 구분할 수 있도록 도와주는 식별자 역할을 한다.또한, super 는 부모 클래스를 참조하며, 중괄호({}) 는 Dart의 파라미터 전달 방식인 named parameter 를 나타낸다. sup..
이전에 특정 도메인의 Mapper 인터페이스에 @Mapper 라는 어노테이션을 설정해서 xml 파일이 해당 mapper 인터페이스를 참조할 수 있도록 하였는데 만약 추가될 Mapper 인터페이스가 여러개면 모든 Mapper 인터페이스에 같은 어노테이션을 적용해야한다. 이럴 때 @MapperScan 이라는 어노테이션을 적용한다. 먼저 프로젝트의 config 패키지에 mybatis 환경설정을 위한 MyBatisConfig 객체를 생성한다.package kr.co.pei.pei_app.config.mybatis;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Configuration;@Con..
개인 프로젝트를 진행하면서 MyBatis 를 학습 하기 위해서 특정 도메인의 모든 쿼리를 MyBatis 를 적용하기로 하였다. 1. SpringBoot 의 build.gradle 에 MyBatis 라이브러리를 추가 2. application.properties 또는 .yml 에 아래와 같이 Mapper 설정 mybatis.type-aliases-package : xxMapper.xml 에서 파라미터 타입 또는 resultType 으로 받거나 반환하기 위한 객체가 존재하는 위치를 prefix 설정을 통해 전체 경로를 parameterType 등의 값으로 적지 않더라도 해당 객체를 자동으로 매핑 할 수 있게 된다. type-aliase 설정을 하지 않으면 전체 도메인 패키지를 parameterType 에 ..
Boolean 또는 boolean 타입과 관련한 Java Bean 규칙, JackSon 직렬화 규칙 DTO 나 Entity 필드명을 isVisible 로 하고 boolean (primitive) 타입으로 선언하면 기본적으로 Jackson 은 visible 이라는 이름으로 응답한다. 이유 : Jackson 은 Java Bean 명명 규칙을 따르기 때문에 @Data@NoArgsConstructorpublic class AdminUpdateSurveyDTO implements AdminSurveyCheckTimeSupport { private boolean isVisible; 위와 같이 isVisible 타입의 필드를 서버에서 Response 했을 때 자동으로 아래와 같이 필드명이 변경 된다. 첨에 ..
// 🔆 compision API 에서 axios 사용 (중요 까먹지 말것))const handleLogin = async () => { try { const response = await axios.post("/login", { username: username.value, password: password.value }, { headers: { "Content-Type" : "application/json" }, }); store.dispatch('login', response.headers['authorization']); } catch (error) { console.log('handleLogin error', error); }}항상 옵션 API 만 사용하다가 이번 프로젝트에서 대부분의 v..
사용자의 활동 로그의 상세 내용을 RDB 의 특정 컬럼에 JSON 형태로 저장하여 필요한 key 로 데이터를 조회하기 위한 엔티티 필드타입을 json 으로 변환후 저장하는 로직을 구현 하였다. 먼저, gradle 에 hibernate 에서 제공하는 의존성을 추가해준다// HIBERNATEimplementation 'io.hypersistence:hypersistence-utils-hibernate-60:3.3.1' 아래 코드는 사용자 활동 로그 추적 후, RDB 에 별도 기록을 위한 엔티티 객체이다@Entity@Table(name = "log")@Getter@NoArgsConstructor@AllArgsConstructor@EntityListeners(AuditingEntityListener.class..
1. docker network ls : 현재 존재하는 네트워크 목록 확인2. sudo docker network create --driver bridge [네트워크명] : 네트워크 생성3. docker network rm [네트워크명] : 네트워크 삭제4. docker start $(docker ps -aq) : 모든 컨테이너 시작5. docker stop $(docker ps -q) : 모든 컨테이너 종료6. docker pull {이미지명} : 도커 이미지 다운로드 - ex) docker pull nginx7. docker image ls : 도커 이미지 목록8. docker image rm {이미지ID} : 도커 이미지 삭제 (전체 ID 입력할 필요 없이 앞에 4~5자리만 입력해도 삭제됨)- 현재..