전체 글 170

☄️쿠석쿠석🌷서비스를 출시하며, feat. 성능 개선

📍쿠석쿠석 서비스란 ?제가 작년부터 기획하였던 건대의 장소 공유 서비스 입니다 !! 그 전까지 개발자로만 프로젝트를 참여해보았지만, 순수하게 사람들의 문제점을 해결하고자, 아이디어를 기획하고, 팀을 셋업하고, 회의를 주관하며 팀 을 이끌어본 경험은 처음이었기에 저 자신이 자랑스러웠습니다(많이컷다 최동훈..ㅎㅎㅎ) 제가 만들고자 했던 서비스라서 저에게 있어서 자식과 같은 서비스 입니다 !! ㅎㅎ.. 부족한 팀장이였지만, 다들 잘 따라와줘서 세상에 나올수 있었던 거 같습니다 !! ㅎㅎ  약 3개월동안 제가 과거에 프로젝트들의 경험을 발판삼아서, 최대한 "애자일 스러운" 팀 문화를 만들려고 노력했던거 같습니다.. ㅎㅎㅎ 매주 스크럼를 진행하며, 각 주차별 스프린트 회고를 진행하였고, 각 직군과 디자이너 분의..

개발 프로젝트 2024.04.25

플리보따리 서비스를 개발하며 -2024-04-04

플리보따리 란 ? 도메인 : www.plypockets.com Git hub : 플리보따리 (github.com) 안녕하세요 구독자 여러분 !! 제가 역대 한 프로젝트중 가장 애정을 가지고 진행했던 서비스에 대해서 소개해 드리겠습니다 !! ☺️ 플리보따리 서비스는 선물과 함께 노래를 전송하는 익명 편지 서비스 입니다 ! 💌 이화여대 디자인 동아리 “UXO” 와 협업하여 만들었어요 !! 저도 전문 디자이너분들과 첫 협업 경험이어서 정말 많이 배웠고, 저랑 전혀 상관없는 직군들과 소통하는 법을 배운거 같았습니다!!🤭 제가 이 프로젝트를 진행하며 많이 배웠고 신경쓰고자 했던 부분은 바로 테스트코드 와 클린코드 였어요 !! 😜 이번 프로젝트에서 반복문 대신 람다와 스트림을 활용한 자바8 부터 추가된 함수형 언어..

개발 프로젝트 2024.03.23

[mysql] : java.sql.sqlexception: access denied for user 'ubuntu'@'172.31.35.55' (using password: yes) 오류 해결기

너무 힘들었다. 도커로 cicd 구축할떄부터 마주했던 애러였다. 도커는결국 RDS로 못쓰고, EC2 내에 mysql을 설치해서 EC2내부 mysql 주소 와 비밀번호, user: root 로 접속하니 잘 되었다. 그런데 나는 RDS를 사용하고 싶었다. 플리보따리 에서 cicd 구축할때는 해당 오류가 나오지 않았는데 왜이런지 모르겠다. 해당 오류를 해결한다고 장장 20시간이 넘게 걸린거 같다. 너무 힘들었지만 끝까지 포기하지않고 온갖 자료,블로그를 100개는 본거 같다. 드디어 해냈다. 해당 오류는 EC2에 CodeDeoploy로 인해서 jar 파일이 실행된 뒤, 스프링 실행로그를 확인해서 나왔다. 애러의 실마리 : 설마하는 마음에 DB의 User를 새로 생성하니 애러 코드가 조금 바뀐걸 알수 있었다. 그..

카테고리 없음 2024.02.22

static 필드에 @Autowired(의존성 주입) 사용하기 (2024-02-09)

겉으로 보기에는 이상이 없는 코드였는데 (물론 이건 내가 실력이 없고 무지했기에 아무런 이상이 없는 코드처럼 보였던 것이다.) NullPointerException이 뜨며 에러가 뜨는 상황이 발생했다. 그래서 디버그 모드로 들어가 하나씩 살펴보던 중 이상한 부분을 발견했다. 바로 @Autowired를 사용한 service 혹은 dao가 null을 저장하고 있었다. null을 저장하고 있던 필드는 static으로 선언된 정적 필드였는데, 이 상황에서 내가 생각했던 것은 정적 필드는 @Autowired를 사용하지 못한다는 생각이었다. 찾아보니 역시나 정적 필드는 @Autowired를 사용할 수 없었고, 이 부분을 모두 바꾸려면 일정을 맞추지 못할 것 같기에 static 필드에 @Autowired를 사용하는 ..

카테고리 없음 2024.02.09

@Value애너테이션과 스프링 빈 생명주기 오류(2024-02-05)

Issue 플리보따리 서비스에서 SpotifyApi관련 유틸을 만들고있던 과정에 발생한 일이다. SpotifyConfig 클래스를 리팩토링 하고있었다. 간단히 설명하자면, SpotifyApi를 생성할려면 개발자 페이지에서 발급받은 클라이언트 키와 비밀번호를 가지고 있어야 한다. 클래스는 하나의 역할을 가진다는 클린코드 철학으로 나는 SpotifyApi 관련 기능들을 SpotifyConfig 내에 맡겼다. 본론으로 들어가서 아래 코드을 보면 import javax.annotation.PostConstruct; @Component @Slf4j public class SpotifyConfig { @Value("${spotify.registration.client-id}") private String CLIEN..

카테고리 없음 2024.02.05

람다와 스트림만 사용하자(feat. CleanCode) 2024-01-30

세뇌하자. 나는 람다와 스트림만 사용하는 프로그래머다.. ㅎ🤣🤣 . 람다식(Lambda Expression)🤡 문법 문법은 간단합니다. 코드를 보는게 이해가 더 빠를 것이라고 생각됩니다. public int sum(int a, int b) { return a + b; } //람다식 변환 (a, b) -> a + b; 장점 매우 깔끔하고 알아보기도 쉽다. 동작을 사용하기 위해서 클래스를 정의할 필요도 없다. 메소드의 리턴 타입도 없고, 메서드의 이름도 없다. 람다와 함께 사용할 수 있다. 매소드 이름없이 작성할 수 있기 때문에 익명 함수(Anonymous Function)라고도 불립니다. 메서드의 이름도 리턴 타입도 없지만 뭐하는 식인지는 쉽게 알 수 있다는 장점 덕분에 java8부터 추가된 것이라고 생각..

Programming/JAVA 2024.01.30

@NotNull VS @Column(nullable = false)

한줄 결론 : 둘다 ddl 생성될때, Not null 제약조건을 걸어준다. 그러나 @Column은 실제 쿼리가 날라간 뒤에 DB에서 예외를 발생하고 @Notnull은 쿼리가 날라가기 전에 예외를 처리해준다. 오늘은 다음의 고민 때문에 글을 작성하게 되었다. JPA에서 DDL을 자동으로 생성할 수 있는데, 이 때 not null 옵션은 어떻게 붙이나? JPA의 엔티티 객체에 @NotNull 검증 어노테이션을 주면 어떻게 되나? @NotNull 대신 @NotEmpty나 @NotBlank를 쓰면 어떻게 되나? 엔티티에 검증 로직을 붙이면 어떻게 작동하나? JPA의 DDL 생성과 제약조건 매핑 JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다. 엔티티로 삼을 객체에 @Entity 어노테이션을 붙이..

카테고리 없음 2024.01.28

클린코드 책 리뷰및 요약(2024-01-27)

이 책을 읽기전, 혹은 클린코드에 대한 개념을 알게되기 전에 내가썼던 코드는 쓰레기 같았다. 개발은 나혼자하는 것이 아니다. 남과 같이 하는 것이다. 아래는 내가 책을 읽으며 앞으로 코딩을 하며 지켜야 할 것들을 정리해 보았다. 1. 클린코드 핵심 요약 및 정리 [ 1. 객체의 생성에도 유의미한 이름을 사용하라 ] 객체의 생성자가 오버로딩 되는 경우 어떠한 값으로 어떻게 생성되는지 정보가 부족할 수 있다. 그러므로 이러한 경우에는 정적 팩토리 메소드를 사용하는 것이 보다 명확한 코드를 작성하게 해 줄 것이다. 하지만 구현을 드러내는 이름은 피하는 것이 좋다. (p32 참고) // 두 번째 인자가 무엇인지 파악이 어렵다. Product product = new Product("사과", 10000); // ..

Programming/JAVA 2024.01.27

JPA의 영속성 컨텍스트와 플러시 이해하기(2024-01-26)

영속성 컨텍스트 JPA를 공부할 때 가장 중요한게 객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapping) 과 영속성 컨텍스트를 이해하는 것 이다. 두가지 개념은 꼭 알고 JPA를 활용하자. 엔티티 매니저 팩토리와 엔티티 매니저 JPA는 스레드가 하나 생성될 때 마다(매 요청마다) EntityManagerFactory에서 EntityManager를 생성한다. EntityManager는 내부적으로 DB 커넥션 풀을 사용해서 DB에 붙는다. 영속성 컨텍스트 영속성 컨텍스트는 JPA를 이해하는데 가장 중요한 용어이다. "엔티티를 영구 저장하는 환경"이라는 뜻 EntityManager.persist(entity); 앞의 예제에서 persist()로 db에 객체를 저장하는 것이라고..