티스토리

검색하기내 프로필

블로그 홈

iamjooon2님의 블로그

구독자
3

구독하기 방명록
신고

인기글

  • Github Action을 이용한 EC2 자동배포 적용기공감수5댓글수3조회 46
  • [자료구조] 딕셔너리(Dictionary), 맵(Map), 집합(Set)공감수0댓글수0조회 17
  • [ORACLE 19C] ORA-01017: 사용자명/비밀번호가 부적합, 로그온 할 수 없습니다.공감수0댓글수0조회 4

주요 글 목록

  • 프로세스와 스레드, 근데 이제 자바를 곁들인글 내용

    보호되어 있는 글입니다.

    좋아요0
    댓글0작성시간2024. 10. 25.잠금
  • test글 내용

    보호되어 있는 글입니다.

    좋아요0
    댓글0작성시간2024. 5. 25.잠금
  • 갱신 분실(lost update) 문제를 어떻게 해결할 수 있을까글 내용

    학교 창업팀에서 재밌게 개발하던 중, 갱신 분실 이슈에 대해 고민할 상황을 만났다 요구사항은 다음과 같았다 매일 자정, 모든 사용자에게 재화를 1개 지급해주세요 우리는 spring boot와 jpa를 사용중이므로, 단순하게 생각하면 아래와 같이 할 수 있을 것이다@Component@Transactional@RequiredArgsConstructorpublic class SchedulerWorker { private final MemberRepository memberRepository; @Scheduled(cron = "0 0 0 * * *", zone = "Asia/Seoul") public void giveAttendanceReward() { memberRepos..

    좋아요0
    댓글0작성시간2024. 3. 27.
    게시글 이미지
  • Lombok is- 필드 직렬화 버그 트러블슈팅글 내용

    요즘 진행중인 프로젝트에서는 API 응답이 성공했는지, 혹은 실패했는지를 포함한 기본 응답 포맷을 사용한다 ResponseBodyAdvice 인터페이스를 구현하여 컨트롤러의 ResponseEntity가 생성된 후, HttpMessageConverter를 거쳐 직렬화 되기 전에 공통된 응답을 감싸 보내는 형식이다 게시글 적으면서 알게 된건데, 이런걸 봉투 패턴(Envelope Pattern) 이라 하더라 아무튼 각설하고, 이 기본 응답엔 isSuccess 필드가 하나 있어서 성공하면 isSuccess : true, 실패하면 isSuccess : false를 기본으로 반환하려 한다 감싸 보내는 코드는 다음과 같다 @Getter public class BaseResponse { private final boo..

    좋아요1
    댓글0작성시간2024. 2. 9.
    게시글 이미지
  • 어린 시절부터 앞서가고 뒤쳐지는 것글 내용

    자신과 동갑이거나 어린데 벌써부터 탁월한 연주자들을 유튜브나 페이스북으로 보면서 열등감과 자괴감 등에 빠진 특히 어린 친구들이 많을 거다. 정보가 넘쳐나고 모든 것들을 확인할 수 있는 시대이기 때문에. 어쩔 수 없는 것 같다.나도 20살 때 마냥 드럼을 좋아하는 일반 전문대 경영학과 학생이었는데. 나랑 동갑내기 학생들의 연주를 공연 등에서 보고 왔을 때도, 또 그때부터 유명했던 비슷한 또래 연주자들을 보면서도 나도 많은 감정을 느꼈다. 내가 10년을 쳐도 저 친구들만큼이라도 칠 수 있을까라는 감정을 꽤 자주 느끼고. 열등감을 느꼈지만 연습도 열심히 했다. 그런데 점점 지나고 보니 깨닫게 된 것은. 연주는 따라잡고 뒤쳐지는 게 없는 거였고, 컬러가 달라지는 거였다. 연주로 따라잡는다는 게 대체 어떻게 판단..

    좋아요1
    댓글0작성시간2024. 1. 4.
  • 동시성 문제를 해결해보자 - RDB 분산 락글 내용

    이전 포스트에서 Java의 synchronized를 이용하여 동시성 문제를 해결해보았는데요 @Transactional 적용이 안된다는 점과, 스케일 아웃 환경에서 동시성 보장이 안된다는 문제가 있었습니다 이 두 문제를 해결할 수 있는 방법으로, 분산 락을 이용하는 방법을 소개해보려 합니다 분산된 환경에서 동일 자원에 접근하는 경우, 동시에 한 개의 프로세스만 접근 가능하도록 하기 위해 사용하는 락을 분산락(Distribution Lock)이라고 합니다. 처음 공부할 때 헷갈린 포인트가 X-lock이니, S-Lock등의 키워드였습니다. 모두 분산된 환경에서의 잠금을 구현하기 위한 방법들이고, 그 구현 방법으로 크게 낙관적 락(Optimistic Lock), 비관적 락(Pessmistic Lock), MyS..

    좋아요1
    댓글1작성시간2023. 12. 4.
    게시글 이미지
  • 동시성 문제를 해결해보자 - synchronized글 내용

    프로젝트를 진행하면서 꼭 한 번 만나고싶었던 문제가 바로 동시성문제였는데요 선착순으로 실행되는 기능이 없고, 좋아요 기능이 있지만 서비스 기획상 치명적이지 않아서, 동시성 문제를 만날 일이 없었습니다 그래서 따로 찾아 공부하고 익혀 정리해보려 합니다 먼저, 동시성 문제란 무엇일까용 공대생의 친구 위키피디아에 동시성 제어를 검색해보았습니다 정보기술과 컴퓨터 과학에서, 특히 컴퓨터 프로그래밍, 운영 체제, 멀티프로세서, 데이터베이스 분야에서 동시성 제어(concurrency control)는 가능한 빠른 조회와 동시에 병행되는 동작의 정확한 결과가 발생하는 것을 보증한다. 라고 합니다 제 언어로 정리해보자면, 동시에 여러 사용자가 접근할 때 발생하는 문제 라고 정리해볼 수 있겠습니다. 코드 예제와 함께 보겠..

    좋아요0
    댓글2작성시간2023. 12. 3.
    게시글 이미지
  • 로컬 캐싱을 이용해서 성능을 높이자글 내용

    집사의고민 프로젝트의 기능 개발은 완료되었고, 이제 리팩터링 및 성능 개선을 고민하고 있는 상황입니다. 그러던 중, 쉽게 바뀌지 않는 API를 캐싱하는 것은 어떨까라는 생각이 들었는데요. 적용 과정과 선택한 기술에 대한 근거를 정리하고자 합니다. 그 전에, 캐시는 무엇일까요 공대생의 친구, 위키백과에게 물어봤습니다 캐시(cache, 문화어: 캐쉬, 고속완충기, 고속완충기억기)는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다. 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간없이 더 빠른 속도로 데이터에 접근할 수 있다. 라고 합니다. 제..

    좋아요1
    댓글0작성시간2023. 11. 13.
    게시글 이미지
  • 비관리 의존성을 트랜잭션에서 제외하기(feat 파사드 패턴)글 내용

    집사의고민 프로젝트에서는 소셜 로그인을 사용하고는데요 사용자 경험 측면에서 회원가입 과정이 간소해지고, 우리 사이트에서 관리해야할 사용자 정보 역시 줄어들어, 보안 측면에서도 이점이 있다고 생각했기 때문이었습니다 하지만 이 소셜로그인 과정에서 문제가 되는 점이 하나 있었는데요 코드와 함께 보자면 @Transactional public TokenDto login(String authCode) { // 외부 인프라 호출 String accessToken = oAuthClient.getAccessToken(authCode); OAuthMemberResponse oAuthMemberResponse = oAuthClient.getMember(accessToken); Member member = memberRepo..

    좋아요2
    댓글0작성시간2023. 10. 9.
    게시글 이미지
  • Java optional - OrElse, OrElseGet 알고쓰자글 내용

    우아한테크코스 프로젝트를 진행하면서 java Optional의 orElse, orElseGet을 아주 제대로 배울 기회가 생겨 정리해본다 후딱 계기가 된 코드부터 살펴보자. public String createToken(String authCode) { String accessToken = oAuthClient.getAccessToken(authCode); OAuthMemberResponse oAuthMemberResponse = oAuthClient.getMember(accessToken); Member member = memberRepository.findByEmail(oAuthMemberResponse.getEmail()) .orElse(memberRepository.save(oAuthMemberR..

    좋아요0
    댓글0작성시간2023. 8. 20.
    게시글 이미지
  • 모킹 관련 어노테이션 정리 - @Mockito @Mock @MockBean @InjectMock글 내용

    우아한테크코스 레벨 3 프로젝트를 진행하면서, 테스트코드 작성을 새로 배우고 있다. 나는 크루들과 테스트에 관한 이야기를 나눌 때 마다 스스로를 클래시스트라고 말했다. 외부 API 사용 같이 '실제 객체를 테스트 할 수 없는 상황이 아니면, 연관된 모든 객체를 직접 테스트해야 그것이 진짜 테스트다'라고 생각했다. 일일히 메서드들을 모킹할 때마다 가독성이 떨어지고, 테스트 해야하는 메서드 하나를 위해, 연관된 수많은 메서드를 짜맞추는 것이 말이 안맞는다고 생각했다. 그렇게 난 레벨2 까지 Controller단은 RestAssured, Service와 Repository는 @SpringBootTest 어노테이션을 이용하여 테스트를 진행했다. 하지만 이런 내 신조는 레벨 3가 되어 아주 보기좋게 깨지고 말았다..

    좋아요0
    댓글0작성시간2023. 7. 23.
  • 집고팀 OAuth 로그인 적용기글 내용

    집사의고민 프로젝트를 진행하며, 카카오 로그인 기능을 맡게 되었습니다 이 과정에서 접한 OAuth 관련 개념과 용어들이 블로그마다 혼재되어있는 경우가 많아서, 많이 헷갈렸습니다🥲 이에 관련 개념을 제 언어로 정리하고, 구현하면서 가졌던 고민들을 정리해보려 합니다 먼저 공대생의 절친 위키백과에서 OAuth라는 단어의 뜻부터 한번 알아봅시다. OAuth("Open Authorization")는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다 네. 그렇다고 하네요 제 언어로 정리해보면, 우리 서비스에서 다른 서비스의 정보를 사용할 수 있는 권한을 위임받는 것..

    좋아요1
    댓글0작성시간2023. 7. 16.
    게시글 이미지
  • Wrapper Class, 그렇게 느린가? (Java Autoboxing 성능 비교)글 내용

    우아한테크코스 방학을 맞아, 여유롭게 레벨 2 내용을 정리하고 있다. 미션 진행 중 리뷰어님께서 남겨준 AutoBoxing, AutoUnBoxing에 대해 직접 실험해보려 한다. 이전까지 내가 알고 있던 것은 Wrapper 클래스를 사용하면 AutoBoxing과 AutoUnBoxing을 하는 과정에서 성능 차이가 발생한다는 것이었다. 하지만 그 차이가 얼마나 유의미하게 차이나는지는 몰라, 내 두 눈으로 직접 보려고 한다! GPT와의 페어프로그래밍으로 아래와 같은 코드를 뽑아냈다...! public class AutoBoxingTest { public static void main(String[] args) { int[] primitiveArray = new int[1_000_000]; Integer[] ..

    좋아요0
    댓글0작성시간2023. 6. 22.
    게시글 이미지
  • Transaction 얕게 아는 체 하기글 내용

    무심결에 썼던 @Transactional, @Transactional(readonly = true) 옵션들을 생각하며, 트랜잭션을 제 언어로 정리해보려 합니다. 1. Transaction? 위키백과에서는 다음과 같이 이야기합니다. *데이터베이스 트랜잭션(Database Transaction)은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다. 이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 영구성(Durability)을 보장한다. 이 성질을 첫글자를 따 ACID라 부른다...

    좋아요0
    댓글0작성시간2023. 6. 5.
  • stream flatMap으로 이중 for loop 없애기글 내용

    // for loop List cards = new ArrayList(); for (Denomination denomination : Denomination.values()) { for (Suit suit : Suit.values()) { cards.add(new Card(denomination, suit)); } } // stream final List = Arrays.stream(Denomination.values()) .flatMap(denomination -> Arrays.stream(Suit.values()) .map(suit -> new Card(denomination, suit))) .collect(Collectors.toUnmodifiableList());

    좋아요0
    댓글0작성시간2023. 5. 22.
  • HandlerInterceptor와 ArgumentResolver를 사용한 인증 개선기 - 2글 내용

    저번 포스트에서 HandlerInterceptor를 적용한 것까지 포스팅했습니다. 컨트롤러에서의 반복되는 인증 작업은 줄일 수 있었지만, 여전히 토큰에서 수출한 사용자 정보가 필요한 상황이었습니다 이는 ArgumentResolver와 커스텀 어노테이션을 이용하여 해결할 수 있었습니다! 먼저, 커스텀 어노테이션부터 한 번 확인해보곘습니다 @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface AuthPrincipal { } AuthPrincipl이라는 임의의 어노테이션을 만들어주었습니다. @Target(ElementType.PARAMETER)를 통해 메서드의 파라미터에서 사용할 수 있도록 적용해주었고 @Rete..

    좋아요2
    댓글0작성시간2023. 5. 8.
    게시글 이미지
  • HandlerInterceptor와 ArgumentResolver를 사용한 인증 개선기 - 1글 내용

    우아한테크코스 장바구니 미션 수행 중, 요구사항으로 인증 기능 구현이 있었습니다. 사용자 정보는 요청 Header의 Authorization 필드를 사용해 인증 처리를 하여 얻습니다. 인증 방식은 Basic 인증을 사용합니다. 예시) Authorization: Basic ZW1haWxAZW1haWwuY29tOnBhc3N3b3Jk type: Basic credentials : email:password를 base64로 인코딩한 문자열 ex) email@email.com:password -> ZW1haWxAZW1haWwuY29tOnBhc3N3b3Jk 처음 구현한 코드부터 같이 보겠습니다. 컨트롤러 부분은 다음과 같습니다. @RestController public CartController { // 필드 및 ..

    좋아요0
    댓글0작성시간2023. 5. 8.
    게시글 이미지
  • Dispatcher Servlet은 뭐하는 놈일까?글 내용

    Spring MVC 구조를 공부하고 있었다. 위와 같은 구조로, Dispatcher Servlet이란 놈이 중심이 되어 일을 하고 있었다. 열정맨 디스패쳐 서블렛... 이놈은 대체 무슨 놈일지 궁금해서 찾아본 것을 정리해보려 한다. 1. Servlet은 뭘까? Dispatcher Servlet에 대해 알기 전에, Servlet부터 알아보자. Dispathcer는 '보내다, 파견하다'라는 뜻을 가지고 있다. 그럼 Servlet은 뭘까? 자바 서블릿은, 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말한다. 흔히 서블릿이라고 부른다. 출처: 위키백과 본명은 Java Servelt이고, 자바에서 HTTP 기술을 사용하기 위해 쓰는 놈이다 2. Dispatcher Servlet, ..

    좋아요0
    댓글0작성시간2023. 4. 23.
    게시글 이미지
  • 이동욱님 특강 - 건강하게 나아지기글 내용

    4월 19일 오전, 우아한테크코스 잠실 교육장에서 인프랩 CTO 이동욱님의 건강하게 나아지기 특강이 열렸다 강의 내용은 다음과 같다 자존감 기둥 만들기 뛰어난 동료, 새로운 환경, 프로젝트 실패 등 자존감이 떨어질 수 있다. 자존감이 무너지지 않도록 나를 지탱할 수 있는 기둥이 필요하다 (한 개가 아닌 여러개) 이동욱님의 자존감 기둥 글쓰기 커뮤니티 참여 전직장 동료와의 대화 운동 독서 멘토링 나만의학습 방법 찾기 회사를 다니면 ‘회사일의 숙련자’가 된다 회사를 길게 다닌다고 개발 전문가는 되지 않는다 나는 새로운 환경에서도 잘할 수 있는 사람인가? 나는 지속적으로 성장할 수 있는 사람인가? 지속적으로 고민할 것, 옆에 두어야 할 사람 옆에 두어야 할 사람은 지금 잘하는 사람이 아닌, 성장이 빠른 사람 ..

    좋아요2
    댓글1작성시간2023. 4. 19.
    게시글 이미지
  • @RestController로 요청이 들어왔을 때, 스프링 MVC는 어떻게 처리할까?글 내용

    웹 자동차 경주 미션을 하며, @RestController 어노테이션만 붙이면 스프링이 알아서 해당하는 요청 경로를 찾아주는게 너무 신기했다. 그래서 이 웹 MVC의 구조를 찾아보며 정리해보려 한다. 클라이언트로부터 요청이 들어오면(1번), 디스패쳐 서블렛은 그 요청을 처리하기 위한 컨트롤러 객체를 검색한다 이때 디스패쳐 서블렛은 직접 컨트롤러를 검색하지 않고 핸들러 매핑이라는 빈 객체에 컨트롤러 검색을 요청한다.(2번 과정) 핸들러매핑은 클라이언트의 요청 경로를 이용해서 이를 처리할 컨트롤러 빈 객체를 디스패쳐 서블렛에 전달한다.(3번 과정) 예를 들어 웹 요청 경로가 '/plays'라면 등록된 컨트롤러 빈에서 '/plays' 요청 경로를 처리할 컨트롤러를 리턴한다. 이때, 컨트롤러 객체를 디스패쳐 서..

    좋아요0
    댓글0작성시간2023. 4. 18.
    게시글 이미지
문의안내
  • 티스토리
  • 로그인
  • 고객센터
© Kakao Corp.