일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- java
- 백준
- Spring
- docker
- 프로그래머스
- springsecurityoauth2client
- 스프링시큐리티
- JIRA
- githubactions
- CI/CD
- oauth2
- 재갱신
- 소셜로그인
- yaml-resource-bundle
- 스프링
- springsecurity
- 도커
- 트랜잭션
- 티스토리챌린지
- springdataredis
- 리프레시토큰
- 데이터베이스
- 국제화
- 토이프로젝트
- 메시지
- AWS
- 스프링부트
- 오블완
- 액세스토큰
- 파이썬
- Today
- Total
목록전체 글 (94)
땃쥐네
마일리지 거래 사례를 통해 확인하는 '트랜잭션'의 필요성 어떤 서비스에서 구매자 '철수'와 판매자 '영희'가 어떤 제품을 거래하는 상황을 상상해봅시다. 대표적으로 아xx매니아와 같은 온라인 게임머니 거래 사이트)가 있겠네요. 여기서는 일단 게임머니 거래, 수수료와 같은 복잡한 상황을 고려하지 않고 단순히 마일리지를 주고 받는 상황을 고려해보겠습니다. 철수가 영희에게 1만 마일리지를 지불하는 서비스 로직을 좀 더 작은 단위로 분리해보면 1. 철수의 마일리지에서 1만 마일리지를 차감 2. 영희의 마일리지에 1만 마일리지를 적립 이 두 가지가 모두 이루어져야합니다. 그런데, 1번은 성공했는데, 2번 작업 진행 과정에서 시스템에 심각한 오류가 발생해서 작업이 진행되지 않는다면 무슨 일이 벌어질까요? 철수의 마일..
이 글은 [Spring MVC] 서블릿(Servlet)이란? 에서 이어집니다. 결국 스레드마다 자바코드가 실행된다. 요청당 스레드! 애플리케이션 코드를 하나하나 순차적으로 실행하는 것은 스레드입니다. 실제로 JVM(Java Virtual Machine)의 Runtime Data Area를 확인해보면 각 스레드마다 stack, pc register, native method stack 을 할당받습니다.(JVM 구조 및 각 요소들의 역할에 대해서는 이 포스팅의 영역을 벗어나므로 다루지 않겠습니다.) 어떤 자바 코드든 결국 스레드 위에서 동작합니다. java 애플리케이션을 실행하면 main이라는 이름을 가진 스레드가 생성되고 main 메서드는 main 스레드의 스택 프레임에 올려져 여기서 자바 코드가 한 줄 ..
서블릿 학습의 필요성 Spring MVC를 이용하면 웹 애플리케이션 구현을 매우 손쉽게 할 수 있습니다. 하지만 이 Spring MVC는 서블릿이라는 오래된 자바 표준 기술을 기반으로 동작합니다. 따라서 Spring MVC에 대해 깊은 이해를 하기 위해서는 우선 Servlet을 이해할 필요가 있습니다. 요청과 응답은 Http 메시지를 통해 이루어진다. 요즘 사용되는 웹 애플리케이션 대 부분은 Http 프로토콜을 기반으로 동작합니다. Http 프로토콜에서 정해진 사양에 따라 Http 메시지를 작성하고 HTML 문서, 단순 텍스트, 이미지, 음성, 영상, 파일, JSON, ... 등등 다양한 형태의 데이터를 끊임 없이 빠르고 간편하고 정확하게 주고받을 수 있습니다. 이 프로토콜에서 정의된 방식대로 Http ..
파일에 대한 권한 설정을 학습하게 된 계기 팀 프로젝트 과정에서, 배포 ec2에서 현재 nginx가 가리키는 포트를 기록하였다가 변경이 일어날 때마다 변경된 포트로 저장값을 갱신하는 파일을 별도로 생성해 관리하고 있었습니다. (/home/ec-user/service_url.inc) 위의 스크립트를 보시면 service_url.inc의 파일 내용을 변경하는 내용이 스크립트에 있습니다. 아무 생각 없이 sudo 명령어로 해당 파일을 파일을 생성하고, 배포 실행 스크립트를 진행했다가 뜻하는대로 포트가 변경되지 않던 문제가 있었습니다. 왜 그랬는가 따져보니, 해당 대상 파일을 root 사용자가 생성했고 해당 파일에 쓰기 권한이 없었기 때문입니다. 저는 이 과정에서 매우 삽질을 했고 파일에 대한 권한 부여 설정에..
1. gradle로 프로젝트 생성 - 빌드툴을 사용해서 프로젝트를 생성한다. - 빌드툴을 사용하는데는 여러가지 목적이 있는데 각종 라이브러리를 떙겨오기 편하도록 하기 위함. - 빌드툴을 통해 실행환경에서 외부 라이브러리를 어디서 무엇을 끌어올지 지정해 줄 수 있고, 자동으로 끌어올 수 있을 것. - 코드를 기반으로 라이브러리 의존성을 편리하게 관리할 수 있게 되고 github과 같은 원격 리포지토리를 통해 소스 파일을 clone 한 개발환경에서 별도의 외부 라이브러리를 끌어쓰지 않아도, 동일환경에서 실행할 수 있기 때문에 많이들 이를 사용하는 것 같다. 2. build.gradle 에서 assertJ 라이브러리 의존성 추가 testImplementation("org.assertj:assertj-core:..
* 주의 : 다른 사람들과 협업을 하시는 개발자분들은 따라하지마세요. 초창기에 백준 2438번 문제를 풀었던걸, 다시 최적화해서 풀면서 새로운 디렉토리로 옮기는 작업을 함께 진행하고 있다. 37bbeef 커밋 뒤에 b0054d9 커밋을 두고 이를 병합시키려면 어떻게 하면 될까? 현재 HEAD 기준으로 상위 3개까지의 커밋의 역사를 개변해야한다. 즉, 현재 HEAD가 가리키는 커밋 기준 4단계 상위의 부모를 기준으로 다시 기존 커밋들을 리베이스 해야한다. 이때는 대화형 rebase 명령을 이용하면 처리하면 편하다. git rebase -i [커밋명] 명령은, 현재 HEAD가 가리키고 있는 브랜치를 지정 커밋을 기준으로 대화형 rebase 시키는 명령이다. git rebase -i HEAD~4 여기서 37b..
빌드 gradle 기준 Windows 기준 사전 설정 git bash 이용하기 : Git Bash는 linux의 터미널 명령어를 사용할 수 있음. intelliJ 기본 터미널을 Git Bash로 지정하기 : IntelliJ 기준 File > Tools > Terminal에서, Application Settings > Shell path에 다음을 지정 후 intelliJ 재실행 "git 설치경로\bin\sh.exe" -login -i 터미널 실행 시 바로 프로젝트 경로가 불러와짐 빌드 및 실행 ./gradlew build : build 폴더 아래에 빌드함 cd build/libs : 프로젝트 폴더 아래의 build/libs로 이동 java -jar 파일명.jar : 빌드된 jar 파일 실행 빌드 제거, 다..
개발환경 JDK 11 이상 IDE : IntelliJ 프로젝트 생성하기 start.spring.io에서 Spring 프로젝트 생성 설정법 Project : Gradle Project Language : Java Spring Boot : SNAPSHOT, M1(미정식 버전)과 같은 문자가 안 붙은 버전들 중 최신 버전 Project Metadata Group : 주로 기업 그룹, 도메인 artifact, name : 빌드 결과물의 이름 Packaging : Jar Java : 11 Dependencies (의존 라이브러리) Spring Web Thymeleaf 가져오기 받은 zip 파일을 풀기 IntelliJ에서, File - Open에서 build.gradle을 선택하여 프로젝트 Open 프로젝트 폴더 ..