전체 글 40

Spring boot 3.x + flutter OAuth2(Google, Kakao) 로그인/회원가입 구현 1 - flutter

▤ 목차🙇‍♂️ Flutter 개발자가 아니라 코드 작성부분은 다소 생략하였습니다.ㅠㅠ  Flutter로 하는 OAuth2 로그인 방법Spring security로 OAuth2로그인을 구현 하려고 하면 보통 web으로 로그인 하는게 많이 보입니다. 하지만 kakao developer 문서를 보면 네이티브 앱에서는 리다이렉트 방식을 사용 할 수 없다고 나옵니다.그래서 공식 문서를 참고하여 프론트(Flutter)와 백엔드(Spring)의 역할을 나눠 개발하기로 했습니다. Google과 Kakao 로그인 개발을 하기 위해 아래 두 문서를 참고했습니다. [참고]  Kakao Developers카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 A..

Backend/Spring 2024.07.31

Java 불변 객체(immutable object)

불변 객체?객체의 상태가 변경되지 않는 객체. 변경이 불가능한 객체를 말한다.Java에서는 final 키워드를 사용하여 불변 객체를 만들 수 있다. 불변 객체의 사용 이유객체가 변경되어도 항상 새로운 객체를 반환하기 때문에 여러 쓰레드가 동시에 한 객체에 접근해도 안전하다.디버깅이나 예측 가능성이 높아지고 메서드 실행시 사이드 이펙트를 예방할 수 있다.변경되지 말아야할 필드값이 존재할 경우 사용가능(JPA)함수형 프로그래밍으로 사용 될 수 있다. 코드로 알아보는 불변 객체 Person.classpublic class Person { public String name; public Age age; public Person(String name, Age age) { this.na..

Backend/JAVA 2024.05.16

이커머스 서비스에서 동시성 문제 처리해보기

동시성이란?여러 작업(스레드)이 공통된 한가지 자원에 동시에 접근하는 것이런 상황에서 주로 발생하는 동시성 문제는 아래와 같다. 경쟁 상태(Race Condition) : 두 개 이상의 스레드가 동시에 공유 자원에 접근하고 수정을 시도할 때 발생한다. 예상치 못한 결과가 발생(DB 일관성이 깨짐)하거나 잘못된 데이터를 조회할 수 있다.교착 상태(Deadlock) : 두 개 이상의 스레드가 서로 다른 자원을 기다리면서 대기하고 있는 상황을 말한다. 서로 다른 스레드가 소유한 자원을 기다리며 멈추어 있다.  이커머스 서비스에서 발생 할 수 있는 동시성 문제재고 갱신시 동시성 문제 : 여러 사용자가 동시에 상품을 구매할 경우, 재고 갱신 과정에서 동시성 문제가 발생할 수 있다. 10명의 사용자가 동시에 같은 ..

Backend/Spring 2024.05.08

Gradle + Nexus Repository library 사용 / Nexus 개인정보 암호화

Spring으로 개발을 하다보면 공통된 기능들을 따로 모아서 여러 프로젝트에 사용한다. 그럴때 많이 사용하는게 Nexus이다. 이번 글에서는 아래 두가지에 대해 알아볼려고 한다. Nexus 개인정보 암호화 하는 방법 Nexus에 올린 library를 가져와서 사용하는 방법 개발환경 macOS(M2 Pro) IntelliJ IDEA gradle 8.1.1 이 방법을 적용하면서 번거로운 부분도 있었다. 전체 프로젝트에 적용이 된다. 패스워드나 아이디, url이 변경될때마다 값을 바꿔줘야한다. 프로젝트를 처음 받는 사람은 설정하기 까다롭다. 그냥 이런 방법도 있구나~~하는 마음으로 봐주시길 바랍니다. 1. Nexus 개인정보 암호화 하는 방법 Nexus library를 사용하기 위해서 build.gradle에..

ETC 2024.03.14

github issue label 모든 repository에 한번에 적용하기

회사에서 ci 작업을 진행하던 중 issue label을 적용시켜야 하는 상황이 생겨서 label을 적용하는 스크립트와 내용을 공유하고자 한다. github 조직에서 관리자 권한은 issue label 을 한 번에 적용시킬 수 있을 거라 생각해서 찾아보니 처음 repository를 생성할 때 적용시키는 것만 있었다. Set the labels that will be included when a new repository is created in this organization. 그래서 더 찾아보니 cmd로 api를 날려서 label을 적용 할 수 있는 github-label-sync 라는걸 찾았다! 필요한건 3가지 정도가 필요하고 위에서 말한 github-label-sync 는 단일 repository만..

Git 2023.11.06

Spring boot 3 JUnit test java.lang.NoSuchMethodError 'parseQualifiedMethodName' 이슈 해결

junit test를 진행할 때 given/when/then 형태로 테스트 작성을 많이 한다. 이때 입력 데이터를 다양하게 받고 싶을 때 아래와 같이 사용하곤한다. private static Stream testParameter() { return Stream.of( Arguments.arguments("test", 1, new TestObject(1)), Arguments.arguments("test", 2, new TestObject(2)) ); } @ParameterizedTest @MethodSource("testParameter") void test(String arg1, Integer arg2, TestObject testObject) { ... } 이슈 사항 이번에 Spring boot 3 ..

Error resolution 2023.09.06

[가상면접 사례로 배우는 대규모 시스템 설계] 처리율 제한 장치

가상면접 사례로 배우는 대규모 시스템 설계 책에서 4장 처리율 제한 장치에 대한 내용을 정리 처리율 제한 장치 처리율 제한 장치는 서버에서 특정 임계치를 정해놓고 해당 임계치를 넘는 요청이 클라이언트나 서비스에서 들어오면 해당 요청을 중단시키는 역할을한다. 처리율 제한 장치를 사용하는 이유는 무엇일까? Dos공격에 의한 자원 고갈을 방지 비용 절감 효과. 서버 과부하를 막음. 사용하는 서버나 시스템 규모에 따라서 처리율 제한 장치의 알고리즘이나 설계가 달라질 수 있다. 따라서 아래에 요구사항에 따라 처리율 제한 장치를 어떻게 사용할 지 정해야 한다. 사용하는 시스템에 따른 처리율 제한 장치의 요구사항을 정리한다. 시스템 규모나 환경, 제어 규칙, 제한 장치의 위치, 제한된 요청의 알림 여부등의 내용들이 ..

ETC 2023.01.12

Spring Transactional Isolation

이전 글 : Propagation Spring Transactional Propagation 이번에 회사에서 transactional anotation을 사용하면서 부족한 게 많아 정리를 한다! @Transactional DB는 트랜잭션 단위로 쿼리를 실행하며 commit을 통해 작업내용을 처리하고 트랜잭션을 종료한다. spring keepbang.tistory.com Propagation에 이어서 Transactional의 속성인 isolation을 정리해볼까 한다. Transaciton은 ACID라는 원칙을 보장해야 한다고 한다. Atomicity(원자성) : 트랜잭션내의 모든 작업은 완료되거나 모두 실패해야 한다. 트랜잭션의 작업중 하나만 완료하거나 할 수 없고 하나라도 실패하면 모두 실패한 후 롤..

Backend/Spring 2023.01.04

Spring Transactional Propagation

이번에 회사에서 transactional anotation을 사용하면서 부족한 게 많아 정리를 한다! @Transactional DB는 트랜잭션 단위로 쿼리를 실행하며 commit을 통해 작업내용을 처리하고 트랜잭션을 종료한다. spring에서는 Transactional 어노테이션을 통해서 DB connection부터 commit까지의 일련의 작업들을 프록시 형태로 제공한다. spring에서 제공하는 AOP(관점 지향 프로그래밍)중 대표적인것이 바로 이 Transactional 어노테이션이다. 사용 방법은 간단하다. ... @Transactional public void save(Member member) {} @Transactional public void findById(Long id) {} ... ..

Backend/Spring 2022.12.28

자바에서 페이징 처리 구현하기(feat. batch)

개발을 하다보면 조회할 때 페이징 처리를 해야하는 경우가 생긴다. 이 글에서는 조회할 때가 아닌 데이터를 저장/수정하거나 삭제 할 때 사용할 수 있는 페이징 방법을 소개해 볼려고 한다. 페이징 처리 데이터를 처리 할 때 너무 많은양의 데이터를 처리할 경우 db성능이나 timeout, 속도등의 문제로 데이터를 일정한 개수만큼 나눠서 처리하는 것을 말한다. 주로 API에서 데이터를 조회할 때 많이 사용했었는데 이번에는 배치에서 데이터를 제어할 때 페이징 처리를 구현하게 되었다. 공통 코드 public class LimitRangeUtil { // default size : 1000 private int fetchSize = 1_000; public LimitRangeUtil(int fetchSize) { t..

Backend 2022.12.24