본문 바로가기
반응형

분류 전체보기179

익명 클래스하고 람다식은 어떤 상황일 때 사용해야할까? 이펙티브 자바라는 책을 읽던 중 람다 함수에 대해 궁금하여 정리해보았습니다. 간단하게 문자열을 길이 순으로 정렬하는데, 정렬을 위한 비교 함수로 익명 클래스로 사용한 방법을 확인해봅시다. Collections.sort(words, new Comparator(){ public int compare(String s1, String s2){ return Integer.compare(s1.length(), s2.length()); } }); 전략 패턴처럼 함수 객체를 사용하는 과거 객체지향 디자인 패턴에는 익명 클래스면 충분했습니다. https://ko.wikipedia.org/wiki/%EC%A0%84%EB%9E%B5_%ED%8C%A8%ED%84%B4 전략 패턴 - 위키백과, 우리 모두의 백과사전 전략 패턴(.. 2022. 3. 10.
딱히 의미를 두고하진 않지만...[2022년 1분기] 올해 1일 1 커밋을 목표로 했는데 벌써 3개월째 열심히 하고 있습니다! 하하! 의미 없는 커밋보다 하루하루 퇴근하고 나서 개인 공부를 꾸준히 하는 목표기 때문에 커밋에 목숨 걸고 하진 않습니다. 1일 1커밋이 주객전도가 되면 별로 영양가가 없으니까요! 단지 꾸준히 공부하려는 의지를 다지려고 합니다. 점점 벅차지만... 현재 하고 있는 JPA, 이팩티브 자바, 클린 코드, Spring, 알고리즘을 열심히 공부하겠습니다. 언젠간 노력의 결실을 맺겠죠? 하하하하..... https://applepick.tistory.com/125 2022년 목표 2021년도 목표를 세우고 거의 다 달성해서 나름 알찬 한 해를 보냈습니다. 2022년도의 목표를 적어보려고 합니다. 다독왕이 되어보자. (한 달에 한 권정도 개발.. 2022. 3. 7.
[JPA] 엔티티 설계할 때 이 점을 주의하자! JPA를 공부하던 중 엔티티를 설계할 때 주의해야 할 점을 정리해보려고 합니다. 엔티티 설계시 가급적이면 Setter를 사용하지 말자! Setter가 모두 열려있으면, 변경점을 찾기 어렵고, 열어놓고 누군가 사용한다면 그 해당 로직을 쭉 읊으면서 변경점을 찾아야 한다는 번거로움이 있습니다. 또한, 리팩터링 하기가 다소 어렵습니다. 모든 연관관계는 지연 로딩으로 설정하자!(제일 중요!) 연관관계는 즉시 로딩과 지연 로딩이 있습니다. 즉시 로딩은 연관된 테이블을 로딩하는 시점에 모두 로딩해주는 방식입니다. 이 방식은 비추! 사용하면 안됩니다. 즉시로딩( EAGER )은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵습니다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생합니다. 실무에서 모든 연관관.. 2022. 3. 5.
파일럿 프로젝트 회고 회사에서 2달간의 신입 파일럿 프로젝트가 곧 끝납니다. 입사 후 스프링을 처음 배우고 제대로 된 협업을 해보면서 폭풍성장 중입니다.(아마?...) 하하 자바에 익숙하지 않으니, 엄청 엄청 부족한 점을 많이 느꼈습니다. 틈틈이 클린 코드, 이팩티브 자바를 읽고 있는데 아직 이해가 되지 않는 부분이 많아 최대한 적용해보려고 합니다. 이번 파일럿 프로젝트에서 사용한 기술 스택입니다. 2달이 짧다면 짧은시간이고 길다면 긴 시간이지만, 엄청 빠르게 지나갔습니다. ㅠㅠ 저희의 목표는 TDD를 제대로 접목시켜 프로젝트를 진행하는 것이었습니다. 이 부분이 가장 어려웠던 것 같습니다. 테스트 코드를 처음으로 적용해보았는데, 팀원들도 한 번도 작성한 적이 없기에... 제가 직접 테스트 코드 관련 서적을 보면서 best p.. 2022. 2. 24.
Spring Boot에서 타임리프 이미지 동적 리소스 사용하기 스프링 부트에서 타임리프를 사용하던 중 이미지를 업로드 후 파일이 즉시 반영이 안 되는 이슈가 있었습니다. 스프링에서 static 폴더는 정적 리소스 폴더인데 여기 안에서 사용자가 이미지를 업로드하고, 삭제, 이용하게 설계해서 이슈가 발생했습니다. 대부분 AWS S3나 외부 디렉터리를 사용하여 컨트롤러 라우터에서 이미지 path를 받고, 외부 디렉터리에서 파일을 가져와 이미지를 뿌려주는 방식입니다. 여기서 중요한 점은 파일이 업로드한다고 해서 바로 웹 리소스로 쓸 수 없습니다. 컨트롤러에 한 번 요청해서 내려줘야 합니다. /resources/user 유저가 파일을 업로드하면 위와 같은 위치에 파일을 저장하게 됩니다. 여기서 웹 리소스로 한 번 더 매핑해서 내려주는 작업을 해주어야 합니다. package .. 2022. 2. 23.
[Spring Boot] mybatis update, delete 무한대기 spring boot에서 mybatis를 사용하고 있습니다. 다른 환경에서 똑같은 디비 저장소(도커 컨테이너)를 사용하고 있는데, 다른 환경에서 트랜잭션이 걸려있을 경우 mybatis는 트랜잭션이 완료될 때까지 무한 대기상태가 됩니다. ㅠㅠ 테스트를 하기 위해 더미 유저를 만들어서 실험해보았습니다. pk값이 701인 유저 정보가 있습니다. delete 직후 아직 DB에 반영되지 않았습니다. commit을 하지 않았을 경우 spring boot에서 해당 로직을 사용한다면 결괏값이 반환되지 않고 무한 대기상태로 계속 있게 됩니다. 다른 환경에서 commit을 하여 디비에 반영하게 된 뒤에 로직이 정상적으로 실행되게 됩니다. 만약 쿼리에서 로직이 넘어가지 않는다면, 다른 환경에서 트랜잭션이 걸려있을 수 있으니.. 2022. 2. 21.
[Spring Boot] 테스트 커버리지 툴 도입(JaCoCo) 회사 동기들과 프로젝트를 진행 중에 테스트 커버리지 툴을 도입하자고 설득하여 도입했습니다. 간단히 사용법을 정리해보려고 합니다. build.gradle에 의존성을 추가해줍니다. plugins { id 'org.springframework.boot' version '2.6.2' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'jacoco' } jacocoTestCoverageVerification { violationRules { rule { // 'element'가 없으면 프로젝트의 전체 파일을 합친 값을 기준으로 한다. limit { // 'counter'를 지정하지 않으면 default는 'INSTRUCTION' .. 2022. 2. 17.
Spring Boot 이미지업로드 (환경: gradle, java11,Spring Boot 2.6.2, thymeleaf) 회원의 사진을 업로드하기 위해서 한번 구현해봤습니다. build.gradle dependencies { implementation 'commons-io:commons-io:2.6' ... } 의존성을 주입해줍니다. form.html .... form에서 중요한 부분이 바로 enctype="multipart/form-data"를 추가해줘야합니다. 간단하게 설명하자면, enctype는 폼 데이터(form data)가 서버로 제출될 때 해당 데이터가 인코딩되는 방법을 명시해줍니다. common.properties ## FilePath file.path=/Users/sungmin/Desktop/~/images/user properties에 파일을 저장할 위치를 선언해줍니다. 이 방법을 쓴 이유는 밑에서 설명해드.. 2022. 2. 14.
참고하면 좋은 URL 설계 개념 문서(document) 단일 개념(파일 하나, 객체 인스턴스, 데이터베이스 row) 예) /members/100, /files/star.jpg 컬렉션(collection) 컬렉션(collection) - 주로 사용 서버가 관리하는 리소스 디렉터리 서버가 리소스의 URI를 생성하고 관리 예) /members 스토어(store) 클라이언트가 관리하는 자원 저장소 클라이언트가 리소스의 URI를 알고 관리 예) /files 컨트롤러(controller), 컨트롤 URI 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행 동사를 직접 사용 예) /members/{id}/delete 리소스를 먼저 생각하자! 만약 이걸로 해결이 안 된다면 컨트롤 URI를 사용하자! 문서, 컬랙션을 적용 -> 안되면 컨트롤 .. 2022. 2. 12.
반응형