전체 글 82

톰캣 콘솔 한글 깨짐 해결

인텔리제이 콘솔에서 톰캣 한글 로그가 깨질 때 해결 방법 증상 체크 톰캣 서버를 띄웠는데, 콘솔에서 한글이 잘 찍히지 않는다. 초기화 과정에서 나오는 메세지가 깨져서 나온다. 기본 Intellij 콘솔 인코딩 깨짐 해결 아래의 화면처럼 깔끔한 초기화 로그 jake-seo-dev.tistory.com 🐱 톰캣 로그 한글 깨짐 해결 4가지 방법 톰캣 로그 한글 깨짐 해결 방법 톰캣 로그를 실시간으로 보면 한글이 외계 문자로 깨져서 나와 눈살을 찌푸리는 경우가 종종 발생한다. 이 경우는 톰캣의 인코딩을 변경해주면 해결할 수 있다. ( inpa.tistory.com [톰캣 로그 한글 깨짐] 이라는 키워드로 구글링을 해서 위 링크들을 포함한 여러 곳에서 알려주신대로 설정들을 다 바꿔봤는데 해결되지 않았다. 그리고..

스프링 없이 mysql 연동

SQLException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 왜 이런 오류를 맞닥드린 것인가? 처음에 Docker를 통한 mysql을 쓴다고, 기존에 내 컴퓨터에서 쓰던 mysql 3306포트를 과감히 kill~ 했다. 그런 후에 Docker 안쓰겠다고 Docker 지우고는 다시 내 컴퓨터에 있는 mysql 쓰겠다고 하니..안되었던 것이다. cmd를 통해 netstat -a -o 명령을 입력하니 3306 포트는 어디에도 없었다. 해결책 먼저 서비스에 들어갔더니 m..

도메인 모델과 테이블 설계

관계형에서는 *부분에 외래키가 존재한다. 외래키가 존재하는 곳이 연관관계의 주인이 된다. 연관관계의 주인은 단순히 외래키를 누가 관리하냐의 문제이다. 비즈니스상 우위에 있다고 주인으로 정하면 안된다. 예를들어, 자동차와 바퀴가 있으면 일대다 관계에서 항상 다쪽에 외래키가 있으므로 외래키가 있는 바퀴를 연관관계의 주인으로 정하면 된다. 물론 자동차를 연관관계의 주인으로 정하는 것이 불가능한 것은 아니지만 자동차를 연관관계의 주인으로 정하면 자동차가 관리하지 않는 바퀴 테이블의 외래키 값이 업데이트되므로 관리와 유지보수가 어렵고 추가적으로 별도의 업데이트 쿼리가 발생하는 성능 문제도 있다. 객체 기준으로는 변경 포인트가 두 군데가 되는데 테이블 기준으로는 외래키 하나만 변경하면 된다. 둘 중에 하나를 주인이..

테스트 코드 작성 - isSameAs, isEqualTo, isInstanceOf

isSameAs : 객체의 참조 값(주소)를 비교 isEqualTo : 특정 값을 비교하거나 String 값 비교 isInstanceOf : 해당 타입의 인스턴스인지를 비교하는 메서드. instanceof 연산자는 객체가 특정 클래스나 인터페이스로부터 생성된 것인지를 판별한다. (객체 instanceof 클래스) 에서 객체가 해당 클래스 혹은 그 하위 클래스로부터 생성된 객체이면 true, 아니면 false를 반환한다.

싱글톤 패턴 구현

스프링은 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다. 웹 어플리케이션은 보통 여러 고객이 동시에 요청을 한다. 그럼 같은 요청이 올 때 마다 고객은 다르니까 여러개 객체를 생성해서 각각의 클라이언트한테 전달해줘야한다. 스프링 없는 순수한 DI컨테이너인 AppConfig는 요청할 때마다 객체를 새로 생성한다. 고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸된다. 따라서 메모리 낭비가 심하다. 이러한 문제의 해결 방안은 객체가 딱 1개만 생성되고, 공유되도록 설계하면 된다. 이러한 설계는 싱글톤 패턴을 사용하는 것이다. 싱글톤 패턴 적용 방법 어떤 누가 해당 클래스의 객체를 생성하든지 딱 하나만 생성되길 원하는 클래스가 있다. 그 클래스로 static 영역에 객체를 딱 1개만..

스프링 빈을 등록할 때는 크게 2가지 방법

스프링 빈을 등록할 때는 크게 두가지로 분류 가능. 1. 빈 자체를 직접 등록하는 방법. xml활용 2. 다른 하나는 우회해서 하는 방법. = 어노테이션을 통해 팩토리 메서드를 통해서 등록하는 방법. @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public MemoryMemberRepository memberRepository() { return new MemoryMemberRepository(); } }

데이터베이스 스터디 회고

JSCODE 모의면접을 시작하게된 계기 내돈내산 후기를 써본다ㅎㅎ 가장 친한 친구의 추천으로 JSCODE 모의면접 데이터베이스 스터디를 시작하게 되었다. 스스로 꾸준히 하는게 어려운 상황에서 이 스터디를 알게되어 정말 다행이었다. 이 스터디에 대한 아래의 자세한 설명 덕분에 더욱 더 신뢰하게 되었다. 모의면접으로 학습하는 컴퓨터공학(CS) 스터디 | Built with Notion 📋 스터디 개요 jscode.notion.site 스터디라면 솔직히 금방 와해되기 쉽상인데, 여기는 이 설명만 다 읽더라도 '와해되지는 않겠다. 체계가 정말 잘 잡혀있구나' 생각했다. JSCODE 모의면접 스터디를 마무리하며 느낀점 실제로 5주동안 참여하면서 멘토님들에게 질문도 자유롭게 할 수 있도록 톡방도 있고, 신경써주셨다..

CS 면접 준비 2023.12.11

데이터베이스 5주차 스터디 정리

📌 5주차 : 트랜잭션, 회복 Commit, Rollback ACID 트랜잭션 격리수준 - DB 세션에 대해서 설명해주세요. - Commit에 대해서 설명해주세요. - Rollback에 대해서 설명해주세요. - Auto Commit 설정에 대해서 설명해주세요. - 트랜잭션에 대해 설명해주세요. - 트랜잭션의 성질 ACID에 대해서 설명해주세요. - 트랜잭션 격리 수준이 뭘까요? - 트랜잭션 격리 수준 READ UNCOMMITTED에 대해서 설명해주세요. - 트랜잭션 격리 수준 READ COMMITTED에 대해서 설명해주세요. - 트랜잭션 격리 수준 REPEATABLE READ에 대해서 설명해주세요. - 트랜잭션 격리 수준 SERIALIZABLE에 대해서 설명해주세요. - DB 동시성 제어에 대해서 설명해..

CS 면접 준비 2023.12.06

깃허브 꾸미기 (리드미 소개, I'm a night, Git stats)

아무것도 없었던 깃허브에 심플하게나마 꾸며보았다. 꾸미니 더 관리하고 싶은 마음이 생긴다. (관리 = 개발 공부 ㅎㅎ) 큰 욕심 없이 1, 2, 3가지를 하고싶었다. 1. 프로필 하단에 한국에 산다. 이메일 주소, 블로그 주소를 넣고싶었다. 2. 상단에 Hi there, 문구로 시작하는 소개글을 넣고싶었다. 3. 커밋하는 시간대와 내가 커밋을 몇번했고 pr은 몇번했는지 등등을 볼 수 있는 I'm a night와 Git Stats 를 넣고싶었다. 1. 프로필 하단에 한국에 산다. 이메일 주소, 블로그 주소를 넣고싶었다. 1번에 대한 것은 간단했다. Edit profile 눌러서 들어가면 되니까! 근데 메일 주소를 넣고싶은데 아무리봐도 메일주소 아이콘이 보이질 않았다. 그래서 검색해보니, 추가로 대표적으로 ..

데이터베이스 4주차 스터디 정리

📌 4주차 : 이상현상, 정규화 Anomaly 함수적 종속 정규화, 반정규화 📌 1. 이상 현상이 뭘까요? 📌 2. 삽입 이상(Insertion Anomaly)에 대해서 설명해주세요. 📌 3. 갱신 이상(Update Anomaly)에 대해서 설명해주세요. 📌 4. 삭제 이상(Deletion Anomaly)에 대해서 설명해주세요. 📌 5. 함수 종속성이 무엇인가요? 📌 6. 완전 함수적 종속은 뭔가요? 📌 7. 부분 함수적 종속은 뭔가요? 📌 8. 이행적 함수적 종속은 뭔가요? 📌 9. 정규화(Normalization)에 대해서 설명해주세요. 📌 10. 제 1 정규형에 대해서 설명해주세요. 📌 11. 제 2 정규형에 대해서 설명해주세요. 📌 12. 제 3 정규형에 대해서 설명해주세요. 📌 13. BCNF ..

CS 면접 준비 2023.11.29

데이터베이스 3주차 스터디 정리

📌 3주차 : 인덱스 Clustered Index, Non-Clustered Index B-Tree 인덱스, 해시 인덱스 📌 1. 랜덤 I/O와 순차 I/O에 대해서 설명해주세요. 📌 2. 인덱스에 대해서 설명해주세요. 📌 3. 인덱스의 동작 방식에 대해서 설명해주세요. 📌 4. 어떤 기준으로 인덱스를 설정해야할까요? 📌 5. 테이블에 인덱스를 많이 설정하면 좋을까요? 📌 6. 커버링 인덱스(Covering index)에 대해서 설명해주세요. 📌 7. 다중 컬럼 인덱스(Multi-column index, 복합 인덱스)에 대해서 설명해주세요. 📌 8. B-Tree 인덱스와 B+Tree 인덱스에 대해 설명해주세요. 📌 9. Hash 인덱스에 대해서 설명해주세요. 📌 10. 클러스터링 인덱스에 대해서 설명해주..

CS 면접 준비 2023.11.22

데이터베이스 2주차 스터디 정리

📌 2주차 : SQL SQL DDL, DML, DCL, TCL 📌 1. SQL이란? 프로그래밍 언어와의 차이점은 무엇인가? 📌 2. 개발자가 작성한 SQL이 어떤 과정을 통해 실행 되는 것인가? 📌 3. DML, DDL, DCL은 무엇인가요? 어떤 구문이 있나요? 📌 4. 참조 무결성에 대해서 설명해주세요. 📌 5. CASCADE 설정에 대해서 설명해주세요. 📌 6. VIEW에 대해서 설명해주세요. 📌 7. SELECT 절의 처리순서에 대해서 설명해주세요. 📌 8. SELECT ~ FOR UPDATE 구문에 대해서 설명해주세요. 📌 9. GROUP BY절에 대해서 설명해주세요. 📌 10. ORDER BY절에 대해서 설명해주세요. 📌 11. INNER JOIN과 OUTER JOIN의 차이점에 대해서 설명해..

CS 면접 준비 2023.11.15

[SQL] 날짜 함수, CASE 문

INDEX 1. 현재 시간 출력 2. 날짜형 간의 뺄셈 3. 현재 날짜에서 1일 후 4. CASE문 (검색 CASE) 5. COALESCE 6. 또 하나의 CASE문 (단순 CASE) 7. 단순 CASE로는 NULL값을 비교할 수 없다. 1. 현재 시간 출력 SELECT CURRENT_TIMESTAMP; 2023-11-09 12:46:55 * 날짜 데이터는 서식을 지정할 수 있다. (문자열 데이터, 날짜형 데이터) 2. 날짜형 간의 뺄셈 SELECT DATEDIFF('2023-01-31','2023-01-01'); 30 3. 현재 날짜에서 1일 후 SELECT CURRENT_DATE + INTERVAL 1 DAY; 2023-11-10 4. CASE문 (검색 CASE) CASE문으로 데이터 변환하기 SEL..

데이터베이스 1주차 스터디 정리

📌 1주차 : 데이터베이스란? 데이터베이스 기본 개념 DBMS 데이터베이스와 파일시스템의 차이 [상세 문항] 📌 파일 시스템과 DBMS(데이터베이스 관리 시스템)의 차이점 📌 데이터베이스의 특징 📌 DBMS 정의, 특징 📌 스키마, 3단계 데이터베이스 구조 📌 데이터 독립성 📌 RDBMS(관계형 데이터베이스 관리시스템) 📌 릴레이션 스키마와 릴레이션 인스턴스 📌 릴레이션의 차수와 카디널리티란? 📌 키(Key) 설명 (슈퍼키, 후보키, 기본키, 대체키, 외래키) 📌 무결성 제약조건 (도메인 무결성, 개체 무결성, 참조 무결성) 📌 사용했던 데이터베이스에 대한 설명 (MySQL, MariaDB) 📌 파일 시스템과 DBMS(데이터베이스 관리 시스템)의 차이점 데이터를 저장하고 꺼내서 쓸 수 있어야한다. 그 첫..

CS 면접 준비 2023.11.08

[SQL] concat, substring, trim, char_length 함수

concat(10, '개') 두 열을 결합한다. 결과값 : 10개 substring('20231031', 1, 4) 20231031에서 첫번째부터 4개 추출. 결과값 : 2023 trim 문자열의 앞뒤로 여분의 스페이스가 있을 경우 이를 제거한다. 다만 문자열 도중에 존재하는 스페이스는 제거되지 않는다. 고정길이 문자열형(ex) char) 에 대해 많이 사용하는 함수이다. CHAR형의 문자열형에서는 문자열의 길이가 고정되며 남은 공간은 스페이스로 채워진다. 빈 공간을 채우기 위해 사용한 스페이스를 제거하는데 TRIM함수를 사용한다. character_length (=char_length) 문자열의 길이를 계산해 돌려주는 함수이다. varchar형의 문자열은 가변 길이이므로 길이가 서로 다르다. 위 함수를..

[SQL] ROUND 함수 (반올림)

[정의] ROUND(첫번째 인수(원하는 값), 두번째 인수) ROUND함수는 기본적으로 소수점 첫째 자리를 기준으로 반올림한 값을 반환한다. 이때 ROUND함수의 두번째 인수로 반올림할 자릿수를 지정할 수 있다. 해당 인수를 생략하는 경우는 0으로 간주되어서 ROUND(amount, 0)이지만 ROUND(amount)로 표현할 수 있는 것이다. [예시] amount라는 열이 있다고 가정하고 그 amount가 3592.67이라는 값을 가지는 행이 하나 있다고 가정하자. 3592.67 => 백의자리는 -3, 십의자리는 -2, 일의자리는 -1, 소수점 첫째자리는 0, 소수점 둘째자리는 1로 나타낼 수 있다. amount 3592.67 ROUND(amount, -3); ROUND(amount, -3); //백의..

[SQL] offset 사용법

페이지 나누기 기능에 주로 사용한다. 커뮤니티 사이트 등에서 게시판 하단 부분 [ 1 2 3 4 5 다음 ] 과 같이 표시된 것이 그 예이다. 페이지 나누기 기능은 LIMIT를 사용해 간단히 구현할 수 있다. 한 페이지당 5건의 데이터를 표시하도록 한다면 첫번째 페이지의 경우 LIMIT 5로 결과값을 표시하면 된다. 그 다음 페이지에서는 6번째 행부터 5건의 데이터를 표시하도록 한다. 이때 6번째 행부터 라는 표현은 결과값으로부터 데이터를 취득할 위치를 가리키는 것으로 LIMIT구에 OFFSET으로 지정할 수 있다. 예시 하나의 테이블이 위와 같고, 한 페이지에 5개씩 표시한다고 가정하자. OFFSET에 의한 시작 위치 지정은 LIMIT 뒤에 기술한다. 위치 지정은 0부터 시작하는 컴퓨터 자료구조의 배열..

스프링 컨테이너의 관리 대상은?

1. 컴포넌트(Component) : 일반적인 스프링 빈 2. 서비스(Service) : 비즈니스 로직을 포함하는 서비스 계층의 클래스 3. 레파지토리(Repository) : 데이터베이스와의 연동을 담당하는 계층의 클래스 4. 컨트롤러(Controller) : 웹 요청을 처리하는 계층의 클래스 5. 구성(Configuration) : 빈 설정 및 다른 구성을 위한 클래스 반면, Entity와 DTO는 스프링 컨테이너에 의해 관리되지 않는 것이 일반적이다. Entity: 엔터티는 데이터베이스의 테이블과 일대일로 매핑되는 객체로, 주로 데이터베이스와의 상호 작용을 위한 정보(예: 데이터)를 표현한다. 각 트랜잭션 또는 요청마다 동적으로 생성되고 변경되므로 스프링 빈으로 관리되지 않는다. DTO(Data T..

더티체킹, @Transcational

@Service @RequiredArgsConstructor @Slf4j @Transactional //더티체킹을 위해 필요. public class HotelService { 더티 체킹은 Transaction 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베이스에 반영하는 JPA의 특징이다. Transactional 어노테이션을 통해 수정API에서 부분수정을 하면 자동 업데이트가 가능하다! 이걸 더티체킹이라고 한다. 자세히 설명하자면 트랜잭션 범위 내에서는 JPA가 제공하는 영속성 컨텍스트가 활성화되어있기 때문에 영속 상태의 엔티티에 대한 변경사항이 자동으로 데이터베이스에 반영된다. 이렇게 Service클래스에 어노테이션을 사용하면 단건조회를 통해 특정 데이터를 변경하면 자동으로 DB에 ..

[JPA] @GeneratedValue(strategy = GenerationType.IDENTITY)

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; JPA Entity의 기본 키 매핑 전략 5가지가 있다. 크게 직접할당과 자동생성으로 나뉘고 - 직접할당은 @Id 사용하는 것. 기본키 직접 할당 전략 (@Id만 적용했을 시) Member member = new Member(); member.setId("1"); //기본키 직접 할당 EntityManager.persist(member); cf) persist()는 리턴값이 없는 insert이다. merge()는 리턴값이 없는 update이다. save는 리턴값이 있는 insert, update이다. save 메서드를 호출하면 새로운 entity이면 persist()를 그렇지 ..

서블릿, 로그인

https://velog.io/@falling_star3/Tomcat-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EC%9D%B4%EB%9E%80 [Servlet] 서블릿(Servlet)이란? 서블릿의 개념과 동작 과정, 생명주기(메서드), 인터페이스, 서블릿 컨테이너에 대해 공부하고 정리한 내용입니다. velog.io 로그인 API 실행시, Filter 인터페이스의 doFilter()실행된다. doFilter() : 필터의 doFilter 메소드는 체인 끝의 리소스에 대한 클라이언트 요청으로 인해 요청/응답 쌍이 체인을 통해 전달될 때마다 컨테이너에 의해 호출됩니다. 이 메서드에 전달된 FilterChain을 사용하면 필터가 요청과 응답을 체인의 다음 엔터티에 전달할 수 있습니다. 이..

제네릭타입 - 메서드에서 사용하기

public CommonResponse onSuccess(int code, T data) { return CommonResponse.builder() .code(code) .success(true) .data(data) .build(); } 제네릭 메서드를 정의할 때는 메서드의 반환 타입 앞에 (또는 , , 등 원하는 이름의 타입 매개변수)를 추가한다. 이렇게 함으로 해당 메서드에서 제네릭 타입을 사용할 수 있게 된다. 메서드의 반환타입을 쓰는 곳 좌측에 를 쓴다!!!!!!! 메서드에서 제네릭 타입을 사용하려면 메서드의 반환 타입 앞에 를 붙여야한다. 매개변수 하나만 제네릭을 사용하든, 반환타입만 제네릭을 사용하든, 둘 다 사용하든 상관없다. 제네릭 타입을 사용하는 경우에는 항상 반환 타입 앞에 해당 제..

[프로젝트 문제 해결] 생성자 주입. 기본 생성자가 왜 안되지? 순환참조 발생

JwtTokenProvider 클래스와 WebSecurityConfig 클래스 두개를 가지고 생각해본다. 결론은 아래와 같은 코드로 마무리를 했고, 내가 궁금했던 것과 결국 어떻게 해결이 되었는지를 작성하려한다. package com.room.yeahnolja.security; import com.room.yeahnolja.domain.member.service.MemberService; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import lombok.RequiredArgsConstructor; import org.springframework.security.a..

스프링 시큐리티 기본 정리

나의 생각을 적는다. 언젠가는 이 글을 보면서 아 이때 이런 생각을 하며 궁금해하고 공부했구나하겠지. 인간이란 동물이 다른 동물과 큰 차이점은 아무래도 생각을 하고 그 생각을 적고 적은 걸 다시 볼 수 있는 것 아닌가! 싶다. 나는 스프링 시큐리티를 구현하면서 인터셉터를 사용하지 않고 필터와 jwt를 사용해서 구현했다. 왜 필터를 사용했냐고 누가 물으면, 엄마가 좋아요 아빠가 좋아요?라고 되묻자고 현업 친구가 말했다. 스프링 시큐리티는 어떤 필터들을 연결시켜서 컨트롤러 단에 가기 전에 인증/인가에 대한 작업을 하는 프레임워크인가? 라는 의문으로 처음에 시작했다. 컨트롤러에서부터 진정한 로직 시작인데 그전에 인증, 인가 관련되서 필요시 세팅을 해준다. 서블릿 단에서 시큐리티에서 만들어준 수많은 필터들이 동..

[스프링 싱글톤 스코프] 생성자 주입 방법, @Autowired, 객체 불변성 무엇?

생성자 주입 방식도 이렇게 두가지로 쓰일 수 있다. 1. public JwtAuthenticationFilter(JwtTokenProvider jwtTokenProvider)로 설정하는 방법은 직접 작성한 생성자 주입 방법. public class JwtAuthenticationFilter extends GenericFilterBean { JwtTokenProvider jwtTokenProvider; public JwtAuthenticationFilter(JwtTokenProvider jwtTokenProvider) { this.jwtTokenProvider = jwtTokenProvider; } @Override public void doFilter(ServletRequest request, Servl..

스프링 싱글톤 빈 라이프사이클, @PostConstruct

스프링에서 싱글톤 빈의 라이프사이클 1. 스프링 컨테이너 생성 : 어플리케이션 컨텍스트(Application Context)가 생성된다. 이때 설정 정보를 바탕으로 빈의 정의 정보가 등록된다. 2. 스프링 빈 생성 : 스프링 컨테이너는 설정 정보를 바탕으로 빈(Bean) 인스턴스를 생성한다. 3. 의존 관계 주입 : 생성된 빈에 대해 필요한 의존성이 주입된다. 이는 생성자 주입, 필드 주입, setter 주입 등의 방식으로 이루어질 수 있다. 4. 초기화 콜백 : 빈의 초기화 작업을 수행한다. 스프링에서는 @PostConstruct 어노테이션 또는 InitializingBean 인터페이스와 같은 방식으로 초기화 콜백을 지정할 수 있다. 5. 어플리케이션 동작 및 데이터 사용 : 어플리케이션은 정상적으로 ..

스프링 빈 등록, DI, IoC 궁금증 해결

궁금증1 [같이 공부하시는 엘리트 분 답변1. ] 메인 메서드는 실행을 담당하고, 프로그램이 실행된 상태에서 외부로부터 API를 통해 통신이 오면 내부 객체들끼리 협동을 하면서 작업을 수행하는데요. @Configuration이나 @Bean이나 @Component 등의 어노테이션이 붙어 있으면 (3개 말고도 여러개 있음) 이 과정에서 매번 새로 객체를 생성할 필요 없이 실행될 때 한 번 객체를 미리 생성해 놓고 기다리고 있는거죠. 그러면 객체를 따로 생성하지 않아도 @Autowired로 주입하면 그 객체를 어디서나 사용할 수 있어요. 그래서 싱글톤 패턴이라고 하신 것입니다. 그렇지만, 모든 클래스에서 사용하지 않습니다. 예를들어 회원이나 주문 클래스같은 경우 인스턴스마다 다른 상태(필드 값)를 가지기 때문..