본문 바로가기

반응형

분류 전체보기

(216)
OSI model 서로 다른 네트워크끼리 통신하려면 데이터 패킷을 전송하는 법, 받는 법에 대한 공통 규칙(common rules)이 필요합니다. 이 규칙을 프로토콜(Protocol) 이라고 부르는데, TCP(Transmission Control Protocol / 전송 제어 프로토콜), IP(Internet Protocol / 인터넷 프로토콜)가 가장 널리 사용되는 프로토콜 중의 하나입니다. 참고로 그 이름에서 알 수 있듯이 TCP/IP 프로토콜은 인터넷 환경에서 컴퓨터들이 서로 정보를 주고받기 위해 사용되는 프로토콜 입니다. 그리고 TCP/IP는 OSI 7 Layer 중에서 Layer 3, 4를 다루는 프로토콜입니다. OSI model OSI model은 네트워크 통신에서 하드웨어/소프트웨어 요소들이 각각 어떤 역할을..
[Java] synchronized 멀티 스레딩 환경에서 여러 프로세스/스레드가 동시에 같은 데이터에 접근할 때 타이밍이나 접근 순서에 따라 결과가 달라질 수 있는 상황을 경합 조건(race condition) 이라고 합니다. 경합 조건 상태에서 애플리케이션을 개발하면 의도하지 않은 결과 출력 또는 버그가 발생할 수 있습니다. 경합 조건을 방지하고 여러 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는 것을 동기화(synchronization)라고 합니다. Java에서는 synchronized 키워드를 사용해서 동기화를 구현합니다. 이 키워드를 사용하면 synchronized 블럭이 생성되는데, 이는 한 번에 하나의 스레드만 허용한다는 의미를 가집니다. 먼저 경합 조건이 어떻게 발생하는지 알아봅시다. import java...
[중고거래장터 - Study&Refactoring] Spring Security를 활용한 로그인 처리 Spring Security를 활용해서 로그인 기능을 구현했습니다. Spring Security는 사용자 인증 및 처리 방식에 대해서 사용자가 임의로 설정할 수 있도록 유연한 구현 환경을 제공합니다. 아래 이미지는 로그인 처리를 위해 사용자 정의 클래스를 생성해서 처리하고 있는 모습입니다. 이해를 돕기 위해 Spring Security 설정 파일을 확인해봅니다. 파일 설정 내용을 확인해보면 사용자 정의 클래스가 빈으로 등록되어 있고, 등록된 빈을 가지고 Spring Security 설정을 하는 것을 확인할 수 있습니다. security-context.xml 사용자 정의 클래스에 대한 내용은 아래 링크를 통해 확인할 수 있습니다. https://github.com/chan-gon/joonggo-market..
[중고거래장터 - Study&Refactoring] 트랜잭션 설정을 통한 데이터 무결성 확보 하나의 요청을 처리하기 위해 하나 이상의 메소드를 호출해야 하는 경우가 있습니다. 이 때 DB에서 하나 이상의 트랜잭션이 발생합니다. 예를 들어 사용자 비밀번호를 변경하는 메소드가 있습니다. @Override @Transactional public void changeUserPwd(UserVO user) { UserVO newUser = userMapper.getUserById(user.getUserId()); String encodedPwd = PasswordEncryptor.encrypt(user.getUserPwd()); UserVO changeUser = UserVO.builder() .accountId(newUser.getAccountId()) .userPwd(encodedPwd) .build(..
[중고거래장터 - Study&Refactoring] locale 변경 로컬 환경에서 구현한 서비스를 AWS 환경에 배포하고 구동했습니다. 로그인 시 아이디/비밀번호가 일치하지 않으면 다음과 같은 메시지가 출력되도록 구현했습니다. 그런데 아래와 같은 메시지가 출력되었습니다. No message found under code 'error.BadCredentials' for locale 'en_US' 아이디/비밀번호 관련 오류 발생 시 security_ko_KR.properties 파일의 error.BadCredentials의 문구가 출력되어야 합니다. .properties 이름에 있는 locale 정보(ko_KR)를 인식해서 properties 파일을 열고, 내부의 메시지를 출력합니다. 그런데 ko_KR 파일이 아닌 en_US 파일을 찾고 있습니다. 문제는 en_US 파일을 ..
폴더 구조를 출력하는 명령어 프로젝트 README 문서를 작성하다가 프로젝트 폴더 구조를 보여주고 싶었습니다. 먼저 윈도우 커맨드 창을 띄운다. 그리고 출력을 원하는 폴더 경로로 이동 후 아래 명령어를 입력합니다. cmd는 명령 프롬프트(cmd.exe)를 실행한다는 의미입니다. 그리고 //c는 뒤에 오는 문자열을 받아서 실행한다는 의미입니다. cmd //c tree 이렇게 입력하면 현재 자신이 위치한 경로 아래의 모든 폴더 경로가 출력됩니다. cmd //c tree 명령어를 입력하면 아래와 같이 출력됩니다. 뭔가 지저분해 보입니다. 좀 더 깔끔하게 출력하고 싶습니다. ▒▒src ▒▒ ▒▒▒▒main ▒▒ ▒▒ ▒▒▒▒asciidoc ▒▒ ▒▒ ▒▒ api-doc.adoc ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒▒▒java ▒▒ ▒▒ ▒▒ ▒..
[중고거래장터] Server Architecture 다른 사람들의 프로젝트 리포지토리를 보면 Server Architecture를 멋지게 만들어 놓은 것을 자주 볼 수 있습니다. 저는 그것이 부러웠습니다. 미적으로 멋있다는 것이 아니고 복잡한 설계를 할 수 있는 지식이 부러웠습니다. 이번 프로젝트에서 제가 설계한 구조입니다. 처음부터 이렇게 설계하지 않았습니다. 아니, 처음에는 개발 환경 설정 및 구현 자체가 버거웠기 때문에 설계 작업 자체를 생각하지 못했습니다. 그래서 모든 작업이 끝나고 문서 작성을 하면서 "아, 내가 이렇게 구현했었구나?" 하는 느낌으로 앞에서 뒤로 천천히 톺아보면서 구조를 정의했습니다. 이 작업을 통해 느낀 점은, 처음부터 설계 방향을 잡고 구현했다면 작업 속도 및 결과물이 지금보다 더욱 좋았겠다는 것입니다. 설치 및 사용과는 별개..
[중고거래장터 - Study&Refactoring] Spring Rest Docs 적용을 통한 API 문서 작성 개발한 중고거래장터 wiki 페이지에 등록할 API 문서를 작성하기 위해 Spring Rest Docs를 사용하기로 결정했습니다. Swagger도 많이 사용하지만, Swagger는 API 테스트 작업에 특화되어 있습니다. 테스트가 아닌 문서 작성 기능만 필요하기 때문에 Swagger와 비교해서 좀 더 깔끔한 문서를 만들 수 있는 Spring Rest Docs를 선택했습니다. Spring Rest Docs 적용에 다음과 같은 기술을 사용했습니다. Spring 5 Maven JUnit4 MockMVC AsciiDoc 그리고 개발 환경은 다음과 같습니다. Spring Legacy Project(MVC) Spring 5.0.7 Maven Java 1.8 MySQL 8.0.27 Redis-x64-3.2.100 구..

반응형