목록전체 글 (348)
정구리의 우주정복
비동기 처리할때 사용하는 WebFlux 에 대해서 정리해보려 한다 ! 써봤는데 남들에게 설명해줄 수준은 아니라 .. 정리해보기 전통적인 Spring MVC와의 차이종류SpringWebFlux프로그래밍 방식동기 (블로킹)비동기 (논블로킹)기반 APIServlet APIReactive Streams (Project Reactor)스레드 사용요청당 스레드 하나적은 수의 스레드로 수많은 요청 처리Return 타입String, Model, ResponseEntityMono, Flux 기존에도 자바에는 Thread 나 Virtual Thread 와 같은 비동기 처리들이 있는데 이들과는 어떤 차이가 있는지 알아보장 내가 이해한 바로는 WebFlux는 프로젝트 전체가 비동기로 돌아가는 거고,Thread나 Virtual..
프로젝트를 하다보면 Response 가 제각각이라 이녀석이 성공인지 실패인지 어떤 상태인지 표현하기가 어렵다그래서 오늘은 공통 Response 를 정의해서 Http status 값과 ,message 그리고 Data 를 넣어보려 한다 어렵지 않음 !!!"기존 Response 를 한번 더 감싸준다"라고 생각하면 쉽다 data class BaseResponse( val status: HttpStatus, val message: String, val data: T? = null) 나는 status , message, data 를 넣었지만 자기한테 필요한 형태로 커스텀 해서 사용 가능하다 만약 기존에 ResponseEntity 이렇게 사용했다면 ResponseEntity> 이렇게 정의해주면 된..
Hash 는 key:value 형태를 가지고 있는 자료구조이다 전화번호부를 예로들 수 있음이름: 번호 이런 형태 !! Hash 의 가장 대표적인 특징은 ``모든 데이터 타입으로 접근 가능`` 하다는 점이다배열을 ['h','e','l','l','o] 이렇게 있을때 각 값에 접근하기 위해선 0~4 까지의 정수로 접근이 가능하다 하지만 hash 의 경우에는{'a':'1234','b':'5678') 이렇게 key 인 a,b 로도 접근이 가능하다 hash 는 주로 언제 쓰이냐면 string 기반으로 정보를 기록하고 관리할 때에 쓰인다 몇문제 풀어보면서 든 생각은dict 랑 set 을 끝내주게 잘 사용할 줄 알면 문제들을 풀 수 있을 것ㄱ 같다
1. 키 (Key) 조회키가 존재하는지 확인 (in 연산자)my_dict = {"apple": 3, "banana": 5, "cherry": 2}print("apple" in my_dict) # ✅ Trueprint("orange" in my_dict) # ❌ False in 연산자를 사용하면 해시 테이블을 이용해 O(1)로 빠르게 키를 검색 가능2. 값(value) 조회특정 값이 딕셔너리에 존재하는지 확인print(2 in hash_map.values()) 3. 키(key) + 값(value) 조회 (items())모든 (key, value) 쌍을 조회할 때 O(n)for key, value in hash_map.items(): print(f"{key}: {value}") 4. 특정 값(valu..
거지같은 메일 전송 (1) 구글 설정Gmail 로 이동 모든 설정보기 클릭 !!! 이거 설정 켜기 (2) 구글 2단계 인증 켜기 보안 > 2단계 인증 들어가서 켜기 !!! 다시 와서 구글 앱 비밀번호 검색 후 만들기 만들어진 앱 비번 복사 고고고 !!!!!!!! (3) Kotlin 으로 돌아와서 spring: mail: host: smtp.gmail.com port: 587 username: 구글 이멤일 password: 앱비밀번호 properties: mail: smtp: auth: true timeout: 5000 starttls: enable: true application.y..
코드를 쓰다보면 val routine = routineRepository.findById(routineId).orElseThrow{ IllegalArgumentException("routine not found") } 이렇게 작성한 경우에는 routine 의 값을 가져올때 (isSuccess) routine.isSuccess 이렇게 가져오고 val routine = routineRepository.findById(routineId) 요롷게 하면 routine.get().isSuccess 이렇게 가져와야한다 왤까 바로바로 타입의 차이이다 orElseThrow 를 사용하게 되면 값이 존재하면 객체 (Routine) 를 반환하고 없으면 예외를 발생하기 때문에 무조건 객체를 가지고 있다고 생각하기 때문에rout..
@Transactional override fun deleteRoutine(userId:Long, routineId: Long): Long { // routine entity 가져와서 val deleteRoutine = routineRepository.findById(routineId).orElseThrow {IllegalArgumentException("routine not found")} // 유저 유효한지 확인하고 val loginUser = userRepository.findById(userId).orElseThrow {IllegalArgumentException("user not found")} if (deleteRoutine...
나도 멋진 CI/CD 를 갖고싶다 Git Action 을 사용해서 만들어봐야징 서버는 Synology 사용했다git action 작성하는거는 어렵지 않았는데 서버 설정이 굉장히 어려웠음 .. 폴더는 .github > workflows > deploy.yml 생성하면 된덩 name: CI/CD for Synologyon: pull_request: branches: - main types: - closedjobs: build: if: github.event.pull_request.merged == true runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@..