본문 바로가기

반응형

분류 전체보기

(124)
뱃지 서비스 리팩토링 [2], 빈으로 등록하고 캐싱곁들이기... 사실 뱃지 서비스는 2가지가 있습니다. 바로 학생 뱃지와 코드포스 뱃지입니다. 학생 뱃지는 디비에서 코드포스 뱃지는 외부 api에서 정보를 가져옵니다. 이번 포스팅에서는 코드포스 뱃지 리팩토링을 진행하겠습니다. 1단계 리팩토링, [코드에서 의미 보여주기] 객체가 너무 많은 역할을 맡고 있는 부분을 분리해 봅시다. 또 구현 대신 의미를 보여주게 만들어봅시다. 아래는 원본 코드입니다. 더보기 package uhs.alphabet.domain.badge; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.InputStream; import jav..
뱃지 서비스 리팩토링 [1], 충격... 알파벳은 깃허브 프로필에 보여줄 수 있는 귀여운 뱃지를 서비스중입니다 프로젝트 열고 가장 충격적인 코드 중 하나가 뱃지서비스인데, 아래는 뱃지 api를 처리하는 컨트롤러 소스 원본.. (눈 건강을 위해 다 읽어보지 마세요...) 더보기 @RequestMapping(value = "/api/getSVG", method = RequestMethod.GET, produces = "image/svg+xml", params = "stuID") @ResponseBody public ResponseEntity getSVG(@RequestParam("stuID") String stuID, Model model) { List personDtos = personService.searchPerson(stuID); Strin..
[1] 에코 서버 만들기 먼저 에코 서버를 만들어 봅시다 에코 서버의 동작 원리는 다음과 같습니다 1. 클라이언트가 서버에게 문자열을 전송한다 2. 서버는 전달받은 문자열을 그대로 클라이언트에게 리턴한다 서버를 구현하기 위해서는 아래와 같은 구현이 필요합니다 1. 서버는 항상 클라이언트의 요청을 대기한다 2. 요청이 확인되면 클라이언트에게 데이터를 반환한다 public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(); [1] serverSocket.bind(new InetSocketAddress("localhost", 1234)); Socket socket = null; [2] whi..
소켓 프로그래밍 시작 전 사전지식 소켓은 두 노드 사이에 통신을 가능하게 하는 엔드포인트라고 생각하면 편합니다 이렇게 써놓으면 어려울 수 있는데 "소켓은 파일이다" 이거 하나만 기억하면 됩니다 그냥 파일에 대고 읽고/쓰면 다른 애가 이걸 집어간다 정도로 이해합시다 파일에 읽고 쓴 걸 누가 집어가느냐하면 OS가 집어갑니다 이때 TCP/UDP 등 소켓 종류에 따라 OS가 처리해주는 방식이 다릅니다 아무튼 소켓은 파일이다 보니 입출력에 주의해야합니다 내가 파일에 뭐라도 써야 읽어갈 데이터가 있는거고, 그러면 이거 읽으려는 친구는 보통 계속 대기해야 하기 때문입니다 이걸 어렵게 말하면 봉쇄(block)이라고 합니다 파일 어떻게 읽고/쓸건지 다양한 방법이 있는데요 전부 구현할 예정입니다 다 구현하려니까 살짝 두렵지만... 포기하지 않고 끝까지 포..
다중 채팅 서버 실습 최근에 네트워크 강의를 수강하고 채팅 서버 실습을 진행했습니다 인터넷에는 뭔가 마음에 드는 채팅 서버 실습이 이상하게 없어 직접 만들었습니다(구현이 이상하거나, 내용이 좋으면 옛날 자료...) 직접 만든 채팅 서버/클라이언트의 동작 모습입니다 클라이언트는 특별한 동작없이도 다른 클라이언트의 채팅 내용을 받을 수 있습니다 자세한 동작 원리는 아래와 같습니다 서버로 입력되는 데이터를 현재 연결된 모든 클라이언트의 소켓에 브로드캐스트합니다(해당 데이터를 전송한 클라이언트를 제외한 모두) 단순히 브로드캐스트하기 때문에 특별한 저장공간은 필요하지 않습니다 클라이언트는 서버의 소켓에 데이터를 쓸 수 있고, 별도의 쓰레드에서 서버로부터의 입력을 항상 대기하고 있습니다 소스코드 추후에 추가 하도록 하겠습니다
재개발 계획과 진행에 대한 작은 포스팅 기존에 진행했던 내용이 거의 기억나지 않는다 어떻게 돌아가는지 파악하기 위해 테스트를 돌려보면서 코드를 파악하기 시작했다 -> 이 과정에서 작게 손대 볼 만한 내용을 모아봤다 1. 날짜 포맷팅 컴포넌트 만들기 2. 뱃지를 만들어주는 컴포넌트 만들기 3. 테스트에 네이밍하기 로컬에서 서버 구동이 안되는 문제도 해결했다 로컬 머신이 예전에 한번 포맷되면서, 깃에서 프로젝트 코드를 다시 받아왔었다 근데 로컬에만 있던 설정 파일은 복원을 못해서 서버 구동에 실패하는 상황이었다 -> 적당히 설정파일 만들어서 해결했다 3번째 이슈인 테스트에 네이밍을 하고 깃에 push를 했다 기존 프로젝트는 dev브런치에서 개발하고 main으로 pr을 보내면, ci/cd를 통해 테스트되고 merge 이후 자동으로 앱이 서버에서 구..
알파벳을 다시 만들어요 이전에 만들었던 알파벳 웹페이지를 다시 개발합니다 그동안 바쁘다고 뒷전이었는데, 매일 꾸준히 시간을 녹이기로 힘든 결정을 내렸습니다 이론적인 부분을 학습하며 개발에 녹여내고 싶다는 욕구가 커졌는데요 이때문에 재개발을 늦출 이유가 없다 생각했습니다 알파벳은 기존에 아래와 같은 기능을 서비스하고 있었습니다 1. 로그인 기능 2. 게시판 기능 3. 깃허브 프로필 뱃지 서비스 기존의 기능은 개선하고, 알림 서비스 등을 추가 할 것 같습니다 개발 과정에서 겪을 수 있는 다양한 경험들을 공유할 예정입니다(사실 이미 재개발은 시작했고, 포스팅은 딜레이가 있습니다...ㅋㅋㅋ) 오랜만에 코드 열어보고 너무 멍판이라 당황했는데요, 면접들어가기 전에 긴장을 푸는 것 처럼 고사성어 외치고 갑시다..! 유비무환!
독후감 - 멀티 코어 cpu이야기 컴퓨터에 대해 정말 잘 알고계시는 분에게 추천을 받은 도서입니다 컴퓨터 구조에 대해 다루고 있는데, 어려운 내용들을 쉽게 잘 풀어 주고 있습니다 어차피 바로 아래서 각 단원을 뜯어 보겠지만 개인적으로 파이프라인 파트가 매력적이었습니다 오랜만에 읽으면서 가슴이 두근거리는 책이었습니다ㅋㅋ ch 1 요약 : 이 책을 읽어야 할까요..? 프로그래머가 굳이 프로세서의 동작 원리까지 이해해야 할까? 나도 책을 짚기 전에 잠깐의 망설임의 순간이 있었다(성격이 단순한 탓에, 그래도 추천도서라, 그냥 군말없이 읽었다ㅋㅋ) 책에서도 고백하고 있듯이 내부 구조를 몰라도 잘 동작하게 하는 것이 전산학의 목표이긴 하다 책에서는 아래의 3가지 점에서 이해를 독려한다 1. 프로세서에서 고민하는 내용이, 원리가 배워두면 더 큰 범위..
1차 개발 후기 (T-001) 2월 27일을 끝으로 1차 개발이 끝났습니다 26일까지는 기능 개발에 집중했고, 27일 하루는 문서화에 할애했습니다 후기가 1주일 늦은 이유는 영어 성적 갱신을 위해...(3월 6일 토스...) 후기 시작 1. 그래서 지금 진행된 기능들에 만족 하나? NO 생각보다 진행이 더뎠다 로그인 기능에서 시간을 많이 사용했는데 이 부분을 고려 못했던게 원인같다 2. 일정은 충분했나? YES 일주일 단위로 짤라서 진행해보니 하염없이 개발하는 것 보다 일정도 잡히면서 좀 더 몰입하게 되더라 3. 앞으로 계획은? 아직 구현 할 기능들이 충분히 많은 만큼 일정을 정해서 빠른 시일 안에 다시 진행 할 생각이다 재밌기도 하고 매일 CS공부만 하는 것 보다는 활기가 돈다ㅋㅋ
로그인 테스트 에러 (T-001) 앞선 포스팅에서는 굉장히 합리적인 이유로(귀찮은 일 하기 싫어서..ㅎ) 테스트를 간추리고 간추렸다 이제 개발해야할 부분이라고는 고작 아래와 같이 몇가지가 남아있었다 1. 레포지토리를 이용해 계정을 등록하기 2. 이때 트랜잭션 이용해서 valid한 계정인거 그냥 셋해버리기 3. mockMvc로 post 요청 보내기 4. 이때 csrf토큰 생성해서 담아주기(이미 어떻게 pssing 하는지 미리 좀 알아 봤지..ㅎ 나 좀 꼼꼼함요ㅋ) @Test @DisplayName("계정을 등록 후, 로그인 시 정상적으로 동작") @Transactional public void loginTest() throws Exception{ Account account = Account.builder() .email("asd@emai..

반응형