일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프리코스
- 트랜잭션
- 우테코
- mock
- 우아한세미나
- HTTP
- Spring Batch
- Docker
- 스프링 부트
- REDIS
- JPA
- 우아한테크코스
- JUnit5
- 의존성
- yml
- 스프링부트
- 프로그래머스
- AOP
- 자바
- 백준
- 미션
- 세션
- CircuitBreaker
- MSA
- AWS
- 코드리뷰
- 서블릿
- Level2
- 레벨2
- Paging
- Today
- Total
목록전체 글 (155)
늘
SonarQube 란 정적 코드 분석을 자동을 수행하는 오픈 소스 플랫폼 중복 코드, 코딩 표준, 유닛 테스트, 코드 커버리지, 코드 복잡도, 주석, 버그 및 보안 취약점에 대해서 검사하고 결과를 보고서로 작성한다. 20개 이상의 언어에 대한 분석이 가능하다. 정적 코드 분석 이란 프로그램을 실행하지 않고 소스 코드나 컴파일된 코드를 분석하는 작업 프로그램을 실행하지 않고 버그나 취약점을 분석할 수 있다. 주로 개발 단계에서 코드의 구조적인 문제나 실수를 찾아내기 위해서 사용한다. 코드 작성단계에서 차후 코드를 실행했을 때 발생할 가능성이 높은 문제를 미리 찾고 대처할 수 있다. 단순이 버그나 오류를 찾아내는 것 뿐만 아니라 더 좋은 코드를 위한 개선점을 제시한다. 반대로 동적 분석에는 모니터링이나 테스..
프로덕션 코드에서 게시글 조회 로직이 있었습니다. 게시글을 조회할 때, 조회수 증가(update)가 있었지만 단순히 조회하는 로직이라고 생각했고 @Transactional(readOnly=true)옵션을 설정해주었습니다. 그리고 서비스 통합 테스트에서는 @Transactional을 통한 롤백을 사용했었습니다. 그래서 테스트에서는 정상적으로 조회수가 증가해서 이상이 없었지만 실제 QA할 때, 조회수가 증가하지 않는 버그를 발견했습니다. 이러한 문제를 어떻게 해결할까 고민을 했었고, 서비스 통합테스트에서 @Transactional을 제거해서 이와 같은 실수가 재발하는 것을 방지했습니다. 문제 상황 해당 메서드를 보고 단순히 조회니깐 readOnly=true를 붙이면 되겠다고 생각했다. 그리고 Service ..
프로젝트 진행하면서 HTTPS 적용기 HTTP 인터넷 상에서 정보를 주고 받기위한 프로토콜(양식과 규칙의 체계) 클라이언트와 서버 사이에 이루어지는 요청/응답 프로토콜 암호화되지 않은 평문으로 데이터를 전송한다. (악의적인 감청, 데이터 변조의 가능성) HTTPS HTTP + secure 모든 HTTP 요청과 응답 데이터는 네트워크로 보내지기 전에 암호화된다. HTTPS는 HTTP의 하부에 SSL과 같은 보안계층을 제공함으로써 동작한다. 도메인 가비아에서 도메인을 구입하면 TTL을 설정할 수 있다. TTL에 대해서 학교에서 배웠는데 기억이 안나서 다시 찾아보았다.. TimeToLive의 약자로 Routing Loop를 방지하여 무한 루프에 빠지는 것을 막을 수 있다. 또한 멀티 캐스팅할 때, 라우터 범위..
무한 스크롤 구현을 요구받아서 처리하려고 찾아본 결과 커서 기반 페이지네이션이라는 키워드가 있어서 찾아 공부해봤다. 1. 페이지네이션(Pagination) 이란? 전체 데이터에서 지정된 개수만 데이터를 전달하는 방법 필요한 데이터만 주고받으므로 네트워크의 오버헤드를 줄일 수 있다. 구현 방법에는 크게 두 가지가 있다. 오프셋 기반 페이지네이션 (Offset-based Pagination) 커서 기반 페이지네이션 (Cursor-based Pagination) 오프셋 기반 페이지네이션 - 페이징 offset만큼 읽는데 이전의 읽었던 것을 다시 쭉 읽은 후 조회해서 데이터가 많아지면 성능상 안 좋다. 데이터 중복 문제: 2페이지 끝까지 읽었는데 앞에 최신 데이터가 들어오면 3페이지 읽을 때 중복이 발생할 수 ..
가장 큰 차이로는, JPA에 의해 처리되느냐, DDL에 의해 cascade가 걸린 테이블이 생겨 DB단에서 처리되느냐 이다. 전자의 방식을 취할 경우, JPA에 의해 외래 키를 찾아가며 참조하는 레코드를 제거해주게 됩니다. 따라서, JPA 상에서는 참조하고 있는 레코드의 개수만큼 delete 쿼리가 생성됩니다. 후자의 방식을 취할 경우, 데이터베이스 자체에서 on delete cascade 제약조건이 걸리게 됩니다. 이를 통해 참조하는 레코드가 모두 제거되는 것입니다. cascade = CASCADE.REMOVE JPA 레벨에서 작동한다. 외래 키를 찾아 참조하는 레코드를 제거해준다. 참조하고 있는 레코드 수 만큼 delete쿼리가 나간다. 부모 테이블의 자식 컬럼에 걸어여하므로(일반적으로 @OneToM..
스프링과 JPA로 애플리케이션을 개발하다 보면 프록시에 대해서 많이 만나게 된다. 이와 관련되어 구글링을 해보면 게시글들마다 다른 말을 해서 직접 정리해보려고 한다. - 총정리 스프링 AOP는 [런타임에 프록시 인스턴스가 동적으로 변경되는] 다이나믹 프록시 기법으로 구현되어있다 인터페이스의 유무에 따라 다음과 같이 나뉜다. 1. JDK 다이나믹 프록시 2. CGLIB JDK Dynamic Proxy JDK에서 지원하는 프록시 생성 방법 Invocation Handler를 재정의한 invoke를 구현하여 부가기능 수행 Reflection API 사용 인터페이스를 통해서만 프록시 생성 가능 CodeGenratorLibrary(CGLIB) 상속을 기반으로 프록시 생성 final이 붙으면 오버라이딩이 불가능하므..
hibernate.ddl-auto 옵션은 Entity객체를 참고하여 애플리케이션 실행 시점에 하이버네이트에서 자동으로 DDL을 만들어주는 옵션이다. JPA 테스트 도중 fk 제약조건이 걸린 엔티티를 생성할 때, 아래 설정처럼 create를 하니 에러가 발생했다. ddl-auto 옵션 create: 기존테이블 삭제 후 다시 생성 + 닫을 때 삭제하지 않는다. create-drop: create와 같으나 종료시점에 테이블 DROP update: 하이버네이트는 주어진 엔티티 구조에 따라서 데이터베이스를 변경한다. validate: 엔티티와 테이블이 정상 매핑되었는지만 확인 none: 어떠한 변화도 주지 않는다.mysql에서 default이다. ddl-auto의 옵션의 시작은 create or update로 시..
@WebMvcTest를 붙이고 테스트를 돌리니 JPA metamodel must not be empty! 와 같은 에러가 발생했다. 이유를 찾아보니 테스트를 돌릴때는 기본적으로 XApplication이 돌면서 작동한다. 따라서 @EnableJpaAuditing을 Application위에 올리면 Jpa관련된 빈들이 올라오기를 요구한다. 이때, mockMvc를 사용한 테스트는 mvc와 관련한 빈들만 찾아서 올리므로 JPA관련 빈을 찾지 못해서 JPA metamodel must not be empty 에러가 발생한다. 해결방법 1. @Configuration 분리 JpaAuditingConfig.java @EnableJpaAuditing @Configuration public class JpaAuditingC..
제이슨의 JPA수업 도중 application.properties의 설정에서 아래와 같은 h2 설정이 있었다. spring.datasource.url=jdbc:h2:~/test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE h2설정할 때, 어쩔때는 h2:mem, h2:tcp였고 이번에는 그냥 h2:~였다. 또한 DB_CLOSE~라는 새로운 이름도 보여서 h2에 대해서 조금 공부해보려고 한다. Connection Modes Embedded mode (local connections using JDBC) Server mode (remote connections using JDBC or ODBC over TCP/IP) Mixed mode (local and remote connect..
제목에 대한 질문에 답을 하지 못했다.이 질문에 대해서 정리를 해보고자 한다. 그전에 트랜잭션이 무엇인지 정리하고 시작하려고 한다. 트랜잭션이란? 데이터베이스에 작용하는 여러 읽기와 쓰기를 수행하는 하나의 작업 단위 트랜잭션 범위 트랜잭션의 범위는 커넥션을 기준으로 한다. 커넥션이 다르다면 6에서 롤백이 일어나면, 3번과 5번에 해당한 쿼리만 롤백이 된다. 즉, 4번에서 쿼리들은 롤백되지 않고 반영이 된다. 다른 말로, 여러 메서드에서 하나의 트랜잭션을 갖고 싶다면 이 여러 메서드들을 하나의 커넥션을 사용하도록 하는 방법이 필요하다. -> 이러한 방법이 트랜잭션 전파를 사용한다. 트랜잭션 전파 보통 스프링에선 @Transactional을 통해 해당 어노테이션이 선언된 내부 메서드들도 한 커넥션에 묶인다...