전체 글

80세까지 코딩하는 것이 목표인 개발자의 골방
이펙티브 자바 골라보기 Object 클래스에서 final이 아닌 메서드(equals, hashCode, toString, clone, finalize)는 모두 재정의(overriding)를 염두에 두고 설계된 것이라 재정의 시 지켜야 하는 일반 규약이 명확히 정의되어 있다. 그래서 Object를 상속하는 클래스, 즉 모든 클래스는 이 메서드들을 일반 규약에 맞게 재정의해야 한다. 하지만 잘못 구현하면 이 규약을 준수한다고 가정하여 설계된 클래스들을 오동작하게 만들 수 있으므로, 주의를 기울여야 한다. equals()를 꼭 재정의해야 할까 가장 쉬운 방법은 아예 재정의하지 않는 것이다. 그냥 두면 해당 클래스의 인스턴스는 오직 자기 자신과만 같게 된다. 다음 상황들 중 하나에 해당한다면 재정의하지 않는 것..
· JAVA
컬렉션 프레임워크 끝내기 #List List 컬렉션은 다음과 같은 계층 구조를 가지고 있다. List 컬렉션에는 ArrayList, LinkedList, Vector와 같은 구현 클래스들이 있다. LinkedList의 경우 다중 인터페이스 구현 클래스이다. List 인터페이스와 Deque 인터페이스를 둘 다 구현하고 있음을 알 수 있다. ArrayList 대표적인 List 구현 클래스이다. 일반 배열과 ArrayList는 인덱스로 객체를 관리한다는 점이 유사하지만, 배열은 고정형 메모리를 가지고 ArrayList는 동적 메모리 구조를 가진다는 점이 다르다. 즉 ArrayList는 size를 조절할 수 있다. 초기에 사이즈를 지정하는 방법은 다음과 같다. List list = new ArrayList(30..
· Spring
Spring Security의 Form Login의 기본적인 사용과 동시성 세션 제어 이슈 해결을 함께 다루어 보았다. 시큐리티 설정하기 코드가 길기 때문에 나누어서 살펴보자. configure가 핵심적인 설정을 맡고 있다고 보면 좋을 것 같다. @Configuration @EnableWebSecurity(debug = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .sessionManagement() .invalidSessionUrl("/auth/invalid-session") .m..
· JAVA
어노테이션의 용도 어노테이션은 다음 세 가지 용도로 사용된다. 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공한다. 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공한다. 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공한다. 어노테이션을 정의하는 방법 어노테이션 기본 정의 public @interface AnnotationName { } 이렇게 정의한 어노테이션은 코드에서 다음과 같이 사용한다. @AnnotationName 어노테이션은 엘리먼트(element)를 멤버로 가질 수 있다. 각 엘리먼트는 타입과 이름으로 구성되며, 디폴트 값을 가질 수 있다. 엘리먼트의 타입은 원시 타입, String, 열거 타입, Class 타입, 그리고 이들의 배열 타입을 사..
· JAVA
자바의 예외 자바에는 에러(Error)와 예외(Exception)가 있다. 에러는 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것이고 개발자는 에러에 대처할 방법이 전혀 없다. 반면에 예외는 사용자의 잘못된 조작 또는 잘못된 코딩으로 발생하는 프로그램 오류이다. 예외가 발생하여 적절히 대처하지 않으면 프로그램이 비정상적으로 종료된다는 점은 둘이 비슷하다. 그러나 예외는 개발자가 예외 처리(Exception Handling)를 통해 대처할 수 있다. 예외에는 크게 일반 예외(Exception)와 실행 예외(Runtime Exception)가 있다. 일반 예외는 컴파일 과정에서 예외 처리가 필요한지 확인하고 예외 처리 코드가 있는지 확인한다. 만약 예외 처리 코드가 없다면 컴파일 ..
[주간 모의 코테 1주차 후기] 오늘은 3시간을 목표로 카카오 2022 양궁대회, 양과 늑대 외 한 문제까지 총 세 문제를 풀고자 했다. 양궁대회는 처음에 떠올린 완전 탐색이라는 아이디어로 1시간 35분 동안 풀었으며, 25개 케이스에서 2개 케이스만 틀리는 나쁘지 않은 점수를 얻을 수 있었다. (하지만 그 두 개의 케이스가 killer case인 듯했다) 아직도 직감에 의존해서 시간 복잡도를 분석하려고 하는데, 정확하게 시간 복잡도를 구하는 연습이 필요할 것 같다. 익숙해지자. 이후 양과 늑대 문제를 푸는데 적절한 알고리즘을 적용하지 못했다. 풀이가 진행될수록 난잡해졌으며, 명확한 알고리즘 선정의 부재라는 문제점이 눈에 보였다. 결국 풀지 못하고 다른 사람들의 접근법을 참고하였고 스스로 풀이를 작성해보..
· Spring
구글링 했을 때 생각보다 정확한 정보가 없길래 글을 작성하게 되었다. PresignedURL을 발급받기 위해서 다음과 같은 과정이 필요하다. AWS S3 버킷 생성 버킷 정책 설정 PresignedURL을 발급받을 IAM 생성 코드 작성 1. AWS S3 버킷 생성 AWS S3 서비스 탭으로 이동해서 버킷 생성하기를 수행하자. 버킷 이름만 잘 짓고 다른 모든 설정은 건들 필요가 없다. 그러나 이 부분은 선택 사항인데, 나의 경우 개발하는 프로젝트에서 프로필 사진을 업로드하면 해당 사진의 공개 URL을 통해서 누구나 접근할 수 있어야 하기 때문에 버킷에 대한 퍼블릭 액세스를 모두 허용해주었다. 생성하면 다음과 같이 보일 것이다. 2. 버킷 정책 설정 생성한 버킷의 세부 정책을 설정하자. (버킷 클릭 -> ..
· JPA
N + 1 문제가 어떻게 발생하고 이를 해결하기 위해서 JOIN이 아닌 Fetch JOIN을 사용하는 이유를 코드 레벨에서 살펴보자. JOIN 먼저 모든 테스트를 수행하기 전에 Member와 Team이 N : 1 양방향 관계를 맺고 Member가 두 명씩 들어가 있는 팀을 3개 만들 것이다. // 모든 테스트 수행 전에 단 한 번만 수행한다. @Transactional @BeforeAll void beforeAll() { for(int i = 0; i < 3; i++) { Member member1 = Member.builder().name("tester" + i).grade(Grade.VIP).build(); Member member2 = Member.builder().name("tester" + (i..
· Spring
여러 원인이 있을 수 있다. 일단 나의 경우 다른 테이블은 정상적으로 생성되는데 Meeting 테이블이 생성되지 않는 문제였다. 오류는 command 실행 오류이고 쿼리에 문제가 있는 것이었다. 스택오버플로우를 돌아다니다가 한 답변에서 힌트를 얻을 수 있었다. postgreSQL의 예약어를 사용하여 문제가 발생했다는 답변이다. 보자마자 내 Meeting 테이블에 limit이라는 필드가 떠올랐고 MySQL에 Reserved keyword를 확인했다. (컨트롤 + F로 검색하면 편함) https://dev.mysql.com/doc/refman/8.0/en/keywords.html MySQL :: MySQL 8.0 Reference Manual :: 9.3 Keywords and Reserved Words 9..
@xftg77g
뇌장하드