목록전체 글 (78)
윤개발
Java를 처음 접할때 배우는 메소드임에도 잘 모르고 쓰는 경우가 많은 Equals와 Hashcode에 대해서 알아보자. 두 메소드는 모든 객체의 부모인 Object 클래스에 구현되어있다. Objcect의 구현된 소스코드를 살펴보자. // Indicates whether some other object is "equal to" this one. public boolean equals(Object obj) { return (this == obj); } Object 클래스에 구현된 equals 클래스이다. 생각보다 코드가 단순하고 객체 자체가 같은지를 비교하는 코드이다. 다음은 hashcode이다. hashcode는 따로 작성된 코드가 없이 native라는 코드가 붙어있다. /** * Returns a ha..

스프링 시큐리티에 대해 제대로 알고 쓰기위해 공식문서를 쭉 읽어보았고 개발시에 알아야될 부분을 정리해보았습니다. docs.spring.io/spring-security/site/docs/5.4.6/reference/html5/#servlet-architecture Spring Security Reference In Spring Security 3.0, the codebase was sub-divided into separate jars which more clearly separate different functionality areas and third-party dependencies. If you use Maven to build your project, these are the modules yo..

이번에 진행하는 프로젝트의 요구사항이 다음과 같습니다. gitlab에 public으로 Markdown(이하 md) 업로드 - 로그인 없이 볼 수 있는 페이지여야함 Vue에서 gitlab markdown을 로딩하여 보여줌 - gitlab 페이지 호출 이렇게 진행하면 다음과 같은 장단점이 있습니다. 장점 html을 수정할 필요 없이 바라보는 gitlab md 파일만 수정하여도 운영환경에 반영(재배포가 필요없음) 프로젝트 초기 자주 수정될 수 있는 Guide, Faq등은 md로 간단하게 표현 가능 단점 gitlab(또는 github) 에서 md를 가져오므로 정적파일을 로딩하는 것보다는 시간이 조금 더 걸림 md를 이용하다 보니 style 적용은 힘듬 Vue에서 Markdown을 불러오며 단점을 극복하기 위해 ..

Gathering-bot 서비스를 개발하면서 성능에서 가장 크게 고민했던 부분에 대한 포스팅입니다. 1. 초기 설계 개발 전 Gathering-bot 서비스 데이터베이스 설계는 다음과 같습니다. 다른 테이블(사람, 배치등)과 일부 컬럼(생성한 사람, 응답시간등)은 주제와 연관이 없어 표기하지 않았습니다 시트는 1개 이상의 취합 항목을 가지고 있습니다. 취합 항목은 시트_id 를 FK로 가진다. 시트는 1개 이상의 응답을 가지고 있습니다. 응답은 시트_id 를 FK로 가진다. 응답은 1개 이상의 응답 항목을 가지고 있으며 시트의 취합항목에 대한 응답입니다. 응답 항목은 응답_id를 FK로 가지며 취합항목_id를 FK로 가진다. 2. 성능 이슈 고민 초기 데이터베이스 설계와 함께 JPA의 지연로딩을 사용하여..
🖐️ 프로젝트 개요 사내에서는 많은 취합 업무가 발생하며 주로 엑셀을 통해 작성하고 메일로 전달되어 통합된다. 메일로 이루어지기 때문에 취합담당자는 수많은 엑셀을 받아서 통합하는 과정이 필요하다. 우리 회사는 폐쇄망이므로 외부 인터넷이 불가능하다 즉 구글 설문조사, 공유문서 사용이 불가능하다 엑셀로 처리하는 취합업무를 빠르게 처리해보고자 프로젝트를 시작하게되었다. 🔎 조사 사내망에서 구글 설문조사, 구글 공유문서를 사용할 수 없음. 미응답자에게 다시 회신해달라는 리마인드 메일을 보내야하는 불편함, 제출 안한 사람의 이메일을 일일히 입력해줘야하는 귀찮음 응답하는 인원은 일을 미뤘다가 응답을 잊을 수도 있음. 수정 요청하는 경우에는 취합을 다시 반복해야함 🔥 프로젝트 내용 취합 담당자 로그인을 하고 시트를 ..
문제 주소 leetcode.com/problems/longest-substring-without-repeating-characters/ Longest Substring Without Repeating Characters - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 내용 Given a string s, find the length of the longest substring without repeating characters. 해설 문자열이 주어질 때 반복되..

Spring Security에 대해 학습하고 로그인, 사용자 관리 웹어플리케이션 개발한다. 프로젝트 개요 게시판을 만드는 프로젝트는 CRUD 기능을 구현하기 위한 기본이 되는 프로젝트라 할 수 있다. 이런 기본적인 게시판에 스프링 시큐리티를 적용해 살을 덧붙이고 싶다는 생각이 들었다. 게시판을 만드는 "구현"에 더해 게시판별로 권한을 처리한다. 또한 동시 접속 서비스 이용자가 1만명이라는 가정하에 "성능"의 측면에서 깊게 고민하며 개발할 예정이다. 구현 목표 구현목표는 아래와 같이 3가지로 정의하였다. 1. Spring Security를 이용하여 여러 방식으로 로그인을 구현한다. (Security 학습) Session JWT Token OAuth 2.0 (추후 예정) 2. 권한 그룹을 만들고 사용자를 관..

용어 설명 Authentication(인증) : 사용자가 본인인지 맞는지 확인 Authorization(권한) : 인증된 사용자가 요청에 접근 가능한지 확인 기본 원리 Client의 요청은 Filter Chain을 거쳐 처리된다. 여러 필터를 지나며 인증이 완료되면 해당요청은 인증된 요청이 된다. 모든 필터를 지나며 인증되지 않았다면 인증되지 않은 요청(403)이 된다. 처리 방식 요청이 오면 인증을 담당하는 AuthenticationFilter에서 처리한다. UsernamePasswordAuthenticationToken을 만들어 AuthenticationManager(인터페이스)에게 위임한다. AuthenticationManager를 구현한 ProviderManager는 AuthenricationPr..

Kafka의 기본이 되는 토픽과 파티션에 대해서 알아보자. Topic (토픽) 전송되는 데이터 스트림을 토픽이라 한다. 토픽은 로그가 될수도 있고 어떠한 데이터도 될 수 있다. 그림에서는 hello 라는 이름의 토픽을 가지고 있다. 데이터베이스의 테이블과 유사하며 제약이 없다. 원하는 만큼 많은 토픽을 생성할 수 있다. (hello_1, hello_2, hello_3 ...) 각 토픽은 이름을 통해 구분된다. Partitions (파티션) 하나의 토픽은 여러개의 파티션으로 구분된다. 그림에서 hello 토픽은 3개의 파티션으로 나뉘게 된다. 파티션은 0 부터 증가하는 id로 구별되며 파티션0, 파티션1, 파티션2은 모두 다른 파티션이다. 각각의 파티션에는 전송된 데이터가 저장이 된다. 데이터가 기록되면 ..

Apache Kafka를 사용하는 이유를 간단하게 알아봅시다. 1. 초기 시스템 처음의 시스템은 사진처럼 단순한 형태를 가지고 있습니다. 예를 들어 웹사이트에서 사용자의 동작을 분석하는 시스템을 생각해봅시다. 데이터를 전송하는 시스템 ( 웹애플리케이션 ) 전송되는 데이터 ( 사용자의 페이지 이동, 동작 등의 데이터 ) 데이터를 받는 시스템 ( 데이터를 받아 처리하는 Spark 등 ) 하지만 추후에 분석해야할 페이지가 늘어나고 더 다양한 분석 시스템이 도입되어 시스템의 규모가 커진다면 어떻게 될까요? 2. 대규모 시스템 다수의 시스템이 생기면 그림처럼 각 시스템의 복잡도가 증가합니다. 4개의 소스시스템과 6개의 타켓 시스템이 모두 연결되어 있다고 가정하면 4*6=24 개의 통합과정이 필요합니다. 시스템 통..

문제 지구 온난화로 인하여 북극의 빙산이 녹고 있다. 빙산을 그림 1과 같이 2차원 배열에 표시한다고 하자. 빙산의 각 부분별 높이 정보는 배열의 각 칸에 양의 정수로 저장된다. 빙산 이외의 바다에 해당되는 칸에는 0이 저장된다. 그림 1에서 빈칸은 모두 0으로 채워져 있다고 생각한다. 그림 1. 행의 개수가 5이고 열의 개수가 7인 2차원 배열에 저장된 빙산의 높이 정보 빙산의 높이는 바닷물에 많이 접해있는 부분에서 더 빨리 줄어들기 때문에, 배열에서 빙산의 각 부분에 해당되는 칸에 있는 높이는 일년마다 그 칸에 동서남북 네 방향으로 붙어있는 0이 저장된 칸의 개수만큼 줄어든다. 단, 각 칸에 저장된 높이는 0보다 더 줄어들지 않는다. 바닷물은 호수처럼 빙산에 둘러싸여 있을 수도 있다. 따라서 그림 1..

에러처리 구현 이번 포스팅에서는 이전에 완료하지 못했던 에러처리에 대해 설명합니다. 에러처리에는 여러 방법이 있으나 이번 게시판에서는 네이버에서 사용하는 에러처리방법을 사용해보겠습니다. 네이버의 에러처리 { "errorMessage": "Authentication failed (인증에 실패하였습니다.)", "errorCode": "024" } 네이버는 에러코드와 함께 에러 메시지를 리턴하는 형식을 가지고있습니다. 에러처리 구현 이에 맞게 exception 폴더에 ErrorResponse 객체를 생성하겠습니다. 생성 전에 JSON으로 에러를 리턴하기위해 JSON-simple 이라는 의존성을 가져오도록 하겠습니다. pom.xml에 아래 의존성을 추가한 후 메이븐을 새로고침해줍니다. com.googlecode..
깨진 창문을 내버려 두지 말라. 엔트로피는 시스템 내의 무질서한 정도를 나타내는 물리학 용어이다. 소프트웨어의 무질서도가 증가할 때 이를 소프트웨어의 부패라고 부른다. 소프트웨어의 부패가 발생하는데에는 심리적이거나 문화적인 요소가 있다. 깨진 창문이론 오랜 기간 수리하지 않고 방치된 창문 하나가 거주자들에게 버려진 느낌을 스며들게 한다. 강국자들이 그 건물에 별 관심이 없다는 느낌이다. 그래서 다른 창문이 하나 더 꺠진다. 사람들은 이제 어지르기 시작한다. 심각한 구조적 손상이 시작되고 느낌은 현실이 되어버린다. 깨진창문을 내버려 두지 마라. 나쁜 설계, 잘못된 결정, 혹은 형편없는 코드를 고치지 않은채로 내버려 두지 마라. 발견하자마자 고쳐라. 고칠 시간이 벗다면 주석으로 처리하거나 '구현되지 않았음'..
가장 큰 약점은 약점을 보일 것에 대한 두려움이다. - 보쉬에 실용주의 철학의 초석 중 하나는 자신과 자신의 행동에 대해 책임을 지는 것이다. 무지나 실수를 인정하는 일은 가장 즐거운 부분은 아니지만 분명 일어나는 일이다. 우리는 자신의 능력에 대해 자부심을 가질 수 있지만 실수나 무지 같은 단점에 대해서도 정직해져야 한다. 1. 책임지기 실수를 저지르거나 잘못된 판단을 했다면 정직하게 인정하고 다른 방안을 제안하도록 노력하라. 다른 무언가를 비난하거나 변명을 만들어 내지말고 해결안을 제공하는 것은 여러분에게 달려있다. "고양이가 내 소스코드를 삼켰어요" 라고 말하는 것은 별 도움이 안될 것이다. 어설픈 변명을 만들지 말고 대안을 제시하라. 안된다고 하지 말고 상황을 개선하기 위해 무엇을 할 수 있는지 ..
당신이 가진 생각이 하나밖에 없다면, 그것만큼 위험한 것은 없다. - 에밀 사르티에 만약 어떤 사실을 굳게 믿고 그 사실에 전적으로 의존하고 있다면, 거의 100% 그것이 변하게 될 것이다. "이 것은 이 방법으로만 해결 할 수 있어"와 같은 근시안 적인 생각을 갖고 프로젝트에 참여한다면 아마도 예상치 못했던 경우에 의해 한숨지을 일이 많을 것이다. 1. 가역성 우리가 프로젝트 초기에 항상 최선의 결정을 내리는 것은 아니라는 점에서 유연한 프로젝트를 만들어야 한다. 프로젝트의 초기에 특정 관계형 데이터베이스를 사용하기로 결정했다고 치자. 한참 후 성능 테스트를 하면서 너무 느리다는 사실을 발견 했고 다른 데이터베이스가 더 빠르다는 것을 알게 되었다. 특정 데이터베이스를 사용하는 코드들이 전반에 퍼져 있을..
설계, 빌드, 테스트 그리고 확장하기에 쉬운 시스템을 만드는데에 있어 직교성은 매우 중요한 개념이다. 1. 직교성이란? 직교성은 기하학에서 빌려온 용어다. 그래프의 축과 같이 두 직선이 직각으로 만나는 경우 직교한다고 말한다. 벡터의 입장에서 보면, 두 개의 선은 독립적이다. 컴퓨팅에서 이 용어는 결합도 줄이기를 의미한다. 하나가 바뀌어도 나머지에 어떤 영향도 주지 않는다면 직교한다고 할 수 있다. 2. 직교성의 장점 비직교적인 시스템은 본질적으로 변화와 조정을 하기가 복잡하다. 시스템의 컴포넌트들이 고도로 상호의존적인 경우, 특정 부분만 수정하는 방법이란 없다. 관련 없는 것들 간에 서로 영향이 없도록 하라. 컴포넌트들이 각기 격리되어 있으면 어느 하나를 바꿀 때 나머지 것들을 걱정하지 않아도 된다. ..

이번 포스팅에서는 User의 Controller, Service, Repository 를 생성하고 회원가입 API를 만들어보겠습니다. 먼저 JpaRepository를 상속받는 UserRepository를 생성합니다. JPARepository를 상속받으면 기본적인 CRUD는 자동생성되며 메소드 이름으로 쿼리를 만들 수 있습니다. package com.board.My.Board.repository; import com.board.My.Board.domain.User; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository { } 이처럼 껍데기만 만들어도 기본..

www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 입력 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,0..
Garbage Collection란? Java에서는 메모리 관리를 명시적으로 해제하지 않고 Garbage Collection(이하 GC)가 자동으로 수행한다. JVM이 GC를 실행할 때 GC를 실행하는 스레드를 제외한 모든 스레드를 중단하는데 이를 stop-the-world 라고한다. stop-the-world가 일어나면 다른 스레드가 실행되지 않기 때문에 GC를 튜닝한다는 것은 stop-the-world 시간을 최소화하는데에 있다. GC는 더이상 필요없는 객체(쓰레기)를 정리하는데 GC는 2가지의 가정하에 만들어졌다. - 대부분의 객체는 금방 접근 불가능한 객체가 된다. - 오래된 객체(생성된지 오래된)에서 젊은 객체(생성된지 얼마되지 않은)로의 참조는 거의 일어나지 않는다. 이러한 가설을 'weak ..

이제 본격적으로 백엔드 API의 Domain을 생성하겠습니다. 먼저 클래스들의 분리를 위해 아래와 같이 패키지 폴더들을 만들어주시면 됩니다. config 폴더는 프로젝트의 설정파일들이 위치할 장소입니다. 나머지 폴더는 이전 포스트에서 설명한 클래스들이 위치할 장소입니다. DB 스키마 생성을 위해 domain 폴더 밑에 Board와 User 클래스를 생성하겠습니다. 간단한 게시판이므로 테이블의 관계는 위 사진과 같습니다. 아래는 User 클래스의 내용입니다. import lombok.Getter; import javax.persistence.*; @Entity @Getter public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) @C..