1️⃣ @Cacheable의 핵심 동작 방식Spring의 @Cacheable은 AOP 기반으로 동작한다. 즉, Spring이 만든 프록시 객체가 캐시 여부를 판단하고, 있으면 반환, 없으면 메서드 실행 및 캐싱을 진행한다. 주의사항은?@Servicepublic class FibonacciService { @Cacheable("fibonacci") public int fibonacci(int n) { if (n 같은 클래스 안에서 fibonacci(n - 1)처럼 자기 자신을 직접 호출하면, 프록시를 거치지 않기 때문에 @Cacheable이 동작하지 않는다. 결과적으로 O(2ⁿ) 재귀 호출이 그대로 실행되어, 캐시를 다는 의미가 사라진다. 위 코드에서 캐시를 적절히 사용하려면 아래와..
종강하고 작성하러 온 마지막 글... 아래는 이전에 작성한 EC2, CodeDeploy, S3 생성 및 세팅 글입니다. (1) EC2 인스턴스 생성 및 세팅(2) CodeDeploy 및 S3 세팅 GithubActions 연동에 들어가기 전 준비물!!!!!첫 번째 글에서 발급받은 사용자 액세스 키와 시크릿 키프로젝트 데이터베이스 스키마의 권한을 얻은 계정의 아이디와 비밀번호AWS S3 버킷 이름AWS CodeDeploy 애플리케이션 이름AWS CodeDeploy 애플리케이션 그룹 이름AWS EC2 인스턴스 이름위에 있는 것들을 미리 준비해 두면 스크립트를 작성할 때 수월합니다. 1. 프로젝트에 deploy.yml 파일 생성우선 프로젝트 최상단에 .github 폴더를 만들고 그 안에 workflo..
vmware 가상 서버에 공격자와 피공격자 서버, 그리고 에이전트 서버를 올려 공격을 테스트했다. 공격에 대응하는 내용도 담겨있다.처음에는 졸업 프로젝트 서버에다가 해볼까 했지만 곧 데모 발표라 불안해서 하지 않았다. 하지만 이제 대응 방법을 숙지했으니 기회만 되면 내가 운영하고 있는 서버를 공격해보고 싶다. 수행한 공격Smurf 공격Sloworis 공격 (Slow HTTP Header DoS)RUDY 공격 (Slow HTTP POST DoS)
@Entity@NoArgsConstructor(access = AccessLevel.PROTECTED)public class Study { // ... @OneToMany( mappedBy = "study", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true ) private List images = new ArrayList(); // ... }위처럼 Study 엔티티에 선언되어 있었는데, List를 Images로 묶고 싶어졌다. 이때 Images는 List를 갖는 일급 컬렉션이다. 근데 엔티티 안에 일급 컬렉션을 넣는 경우는 처음이라 어떻게 해야 할지..
컨트롤러 응답을 이렇게 구현했다가 403 Forbidden이 발생해서 5시간 동안 삽질했다.더 부끄러운 건 로그를 제대로 안 봐서 이 사단이 만들어졌다는 거다.. 2024-05-23T01:55:58.686+09:00 WARN 60868 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation]HttpMediaTypeNotAcceptableException라고 명시되어 있는데 응답이 403 Forbidden라 권한 문제로 착각 + WARN 경고여서 그냥 넘겼다... 이렇게..
한 명의 Member가 Account라는 객체를 가지도록 구현했는데 값 객체와 엔티티의 개념이 모호하여 정리하게 되었다. 아래는 기존 코드이다. 1️⃣ Member Entitypublic class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Valid @Embedded private Account account; @NotBlank private String nickname; private Role role; @Builder public Member(Account account, String nickname, Role role) { ..
닉네임 뒤에 난수 식별자 붙이는 기능을 구현하면서 늘 사용하던 Random 객체를 사용했다. 근데 어느 친절한 개발자 분께서 "Random 클래스"의 문제점이 뭐냐고 물어보셨다.네? Random class에 문제점이 있었나요? 바로 어떤 문제점이 있는지 찾아봤다. 1. 보안 Random 객체를 사용할 경우 생각보다 난수 같지 않은 난수를 얻는다(특징이 반복되는 난수들이 생성된다). 그래서 SecureRandom 객체를 사용해서 더 난수에 가까운 값을 만들 수 있다. 비교적 난수를 예측하기 쉬운 Random보다 SecureRandom 객체를 사용하는 것이 좋다. 라고 하면 좋겠지만 SecureRandom 객체 역시 사용하지 않는 게 좋다. 보안 목적을 떠나서 SecureRandom 객체 역시 Ra..
특정한 관심사에 따라 기능을 나누고, 각 기능을 독립적으로 개발한 뒤 이를 조합하는 방식으로 복잡한 소프트웨어를 구성해 보자는 아이디어를 관심사의 분리(Separation of concerns, SoC)라고 한다. 관심사를 분리하여 코드를 작성하게 되면, 독립된 특정 기능에 집중할 수 있기 때문에 코드를 파악하는데 수월하며 특정 기능을 변경하거나 추가할 때도 그 부분만 교체하면 되기 때문에 훨씬 간단하게 문제를 해결할 수 있다. 정리모듈이 하나의 목적만 가지도록 만들기 위함이다. 다양한 기능을 가지지 않고 하나의 기능만 가짐으로써 수정될 이유도 한 가지만 가진다. 하드웨어보다 유연하게 수정할 수 있는 소프트웨어는 변화에 유연하게 대응해야 한다. 그러나 모듈마다 여러 기능을 가지고 있으면 수정의 복잡도가..