본문 바로가기

SPRING

(11)
[Spring boot] Gmail SMTP ( Simple Mail Transfer Protocol) 이메일 전송하는 방법 JAVA에선 이미 메일을 보낼 수 있게 개발 해놓은 인터페이스가 존재하는데 바로 'JavaMailSender' 이다. 그 중 나는 Gmail SMTP 를 사용해서 이메일을 발송할 것이다. SMTP ( Simple Mail Transfer Protocol) : 메일 서버에서 인터넷을 통해 보내는 전자 메일에 사용하는 전자 메일 프로토콜 먼저 코드를 작성하기에 앞서 보안 선처리가 필요하다. 구글 로그인 후 계정 > 보안 에 들어간다 2단계 인증 로그인이 완료되었으면 검색에 '앱비밀번호' 를 검색해서 들어가준다 그리고 다음과 같이 앱 비밀번호를 하나 만들어준다 나는 앱 이름을 my_exchange로 설정하였고 설정을 완료하면 다음과 같이 앱 비밀번호를 생성해준다 생성된 비밀번호는 코드에서 사용할 것이므로 따..
[SPRING] Spring batch 오류 해결 Step already complete or not restartable, so no action to execute: StepExecution: 이전에 만들었던 spring batch 코드를 다시 실행시켜보니 다음과 같은 오류가 발생했다. Step already complete or not restartable, so no action to execute: StepExecution: 내 코드는 이전 포스팅에서 예제로 사용했던 miracleMorning() job이다. Spring boot batch 및 scheduler 예제 포스팅 👉 https://seo-0.tistory.com/28 왜그런지 한참 찾아보니 job builder를 선언해주는 부분에서 .end()로 flow를 종료하면서 Job의 BatchStatus와 ExitStatus가 COMPLETED으로 리턴된다. 이 때 Job의 재시작이 불가능하다!!! public Job miracle..
[SPRING] Spring batch 와 Spring Scheduler 예제 Spring Batch : 대용량 일괄처리의 편의를 위해 설계된 Spring Boot 배치 프레임워크로, 배치 프로그램의 기본적 구성 요소인 로깅, 병렬처리, 대용량 데이터 처리를 위한 작업들을 제공한다. Job & Step 스프링 배치의 가장 기본이 되는 구성요소로 Job 안에는 여러 Step이 존재하고, Step 안에 Tasklet 혹은 Reader & Processor & Writer 묶음이 존재하며 다음과 같은 예시를 들 수 있다. JOB(name = "miracleMorning") : 매일 아침 6시에 일어나면 커피를 마시고 운동을 간다 만약 그렇지 못하면 물을 마시고 운동을 간다 Step(name = "wakeUp") : 일어난다 Step(name = "drinkCoffee") : 커피를 마..
[SPRING] 싱글톤 패턴, 싱글톤 컨테이너와 Bean 싱글톤 패턴 Singleton pattern 여러 소프트웨어 디자인 패턴 중 하나로, 싱글톤 패턴을 따르는 클래스는 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴하는 디자인 패턴이다. 사용이유 메모리 낭비를 줄이기 위해 순수 DI(Dependency Injection 의존성주입) 컨테이너 여기서 m1과 m2는 서로 다른 객체이다 void test(){ AppConfig appConfig = new AppConfig(); MemberService m1 = appConfig.memberService(); MemberService m2 = appConfig.memberService(); // m1 != m2 } 싱글톤 패턴..
[SPRING] 다중 Database 및 분산 Transaction 설정 예제 ChainedTransactionManager vs JtaTransactionManager Spring boot JPA 다중 database를 설정한 후 여러 datasource에 다중 transaction 설정을 하려고 한다 먼저 다중 database를 설정해주자 다중 Database 설정 yml 파일에 다음과 같이 2개의 디비를 선언해준다 첫번째 database : my_advanced_admin 두번째 database : my_advanced_member spring: datasource: admin: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: "jdbc:mysql://127.0.0.1:3306/my_advanced_admin?serverTimezone=UTC&characterEncoding=UTF-8" username: "root" ..
[JPA] @CreatedDate @LastModifiedDate 오류 해결 문제 상황 : @CreatedDate @LastModifiedDate 어노테이션을 사용해서 Entity에 날짜 데이터를 담으려고 하는데 계속 null로만 데이터가 들어온다 해당 entity를 JPA save 메소드를 사용해서 디비에 insert 시켰지만 createdAt 컬럼과 updatedAt 컬럼의 값에 어노테이션 적용이 제대로 되고 있지 않는다 원인 : JPA Auditing 설정을 추가해주자 먼저 어노테이션을 적용하고자 하는 Entity에 @EntityListeners(AuditingEntityListenet.class) 를 붙여준다 그리고 JPA Auditing 어노테이션들을 모두 활성화 할 수 있도록 Application.class 파일에 활성화 어노테이션 @EnableJpaAuditing을 ..
SPRING으로 AES CBC, KISA_SEED_CBC 를 활용한 암호화 사용자 CI 나 주민번호 및 핸드폰 번호와 같은 개인정보는 DB에 저장할 때 뿐만아니라 조회되는 데이터도 암호화되어 보여져야 한다. 이를 위해 JAVA의 AES CBC 와 KISA_SEED_CBC를 활용하여 DB에 들어갈 데이터는 AES로 암호화하고 외부로 보여지는 데이터는 KISA_SEED_CBC로 암호화하여 보여지도록 해보자 외부 -> DB BASE64(SEED128 CBC(평문)) 으로 암호화된 데이터를 SEED128 CBC로 복호화하고 복호화된 데이터를 AES로 암호화하여 DB에 저장 DB -> 외부 AES로 암호화된 DB의 데이터를 AES/CBC/PKCS5Padding 로 복호화하고 복호화된 데이터를 SEED128 CBC로 암호화여 외부에 노출 활용 스펙 및 기술 : Spring boot JAV..
[SPRING] QueryDSL 복잡한 정렬 custom order by 설정 OrderSpecifier CaseBuilder 문제상황 단순히 하나의 컬럼 값으로 내림차순 오름차순 정렬하는것이 아닌 해당 컬럼의 값에 따라 커스텀 정렬하고자 한다 프로젝트 스펙 Spring boot / JAVA 11 / JPA / MySQL 해결방안 QueryDSL OrderSpecifier CaseBuilder 를 사용하자 예시 Video라는 테이블의 category라는 컬럼이 존재한다 category 데이터를 단순히 문자열의 내림차순 오름차순으로 정렬하는 것이 아닌 '두드러기 -> 백반증 -> 바이러스사마귀' 순 으로 정렬하고 싶을 떈 QueryDSL을 사용해서 custom order by를 설정하자 public List getVideoListOrderByCategory(){ JPAQueryFactory jpaQueryFactory = new ..