전체 글 132

[Springboot] S3에 이미지 올리기

S3에서 버킷 생성 및 IAM 설정을 완료한 후 작성해야 한다. gradle.build implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' application-security.properties # mySql spring.datasource.url=jdbc:mysql://localhost:3306/{DB명} spring.datasource.username={유저이름} spring.datasource.password={패스워드} #AWS S3 cloud.aws.credentials.accessKey={엑세스키 입력} cloud.aws.credentials.secretKey={시크릿키 입력} cloud.aws.s..

Springboot 2023.08.01

[Springboot] UnsatisfiedDependencyException

처음보는 에러가 발생해서 찾아봤다. UnsatisfiedDependencyException은 빈 객체 생성 과정에서 의존주입을 하게 되는데, 필드에 해당하는 의존관계를 만족시킬 수 없을때 발생하는 예외였다. 에러코드를 읽어보니 imageRepository가 JPA의 관리 대상이 아니라서 발생한다고 했다. JpaRepository의 제네릭 타입은 Entity 클래스와 해당 Entity의 기본키(PK) 타입이어야 한다. (ex: JpaRepository) 하지만 자세히 몰랐었기에 여러 이미지를 리스트에 넣은 후 저장하고 싶어서 JpaRepository 로 생성했기에 발생했던 에러였다. 이후에 추가적으로 수정하여 무사히 작동하였다.

Springboot 2023.08.01

[CS] TDD(Test-Driven Development)란?

TDD(Test-Driven Development) TDD는 테스트 주도 개발이라고도 불린다. 테스트 코드를 작성하고 이를 통과하는 최소한의 코드를 작성한 후에 리팩토링하는 과정을 반복하여개발하는 방식이다. 1. 기능 코드를 작성하기 전에 테스트 코드를 먼저 작성하여 테스트 하는 것이 핵심 원칙이다. 2. 보통 단위 테스트로 진행한다. 3. 테스트를 통과할 수 있는 최소한의 코드만 작성하여 기능이 작동하는지 검증한다. 4. 기능이 작동하는 것을 확인 후 코드 구조 개선 및 중복 제거 등 작업을 수행하는 리팩토링을 진행한다. 장점 1. 코드 품질 향상: 각 기능에 대한 테스트를 보장하므로 코드 품질이 높아지며 버그를 발견하기 쉬워진다. 2. 신뢰성 확보: 테스트를 통과한 기능은 정상적으로 동작한다는 확신을..

CS 2023.07.31

[WIL] week 7

Fact: 학습내용 이번주는 pinterest를 클론코딩 하였다. 저번주 프로젝트에서는 security쪽을 담당했었지만, 관계 부분을 해보고 싶었기에 이번주는 댓글 및 대댓글 CRUD, 좋아요 버튼과 globalException을 구현하였다. Feeling: 느낀 점 1. 관계에 대해 강의를 통해 배웠었지만 실제로 사용해보니 헷갈리는 것도 많고 어려웠다. 2. 대댓글을 구현할 때에 댓글과의 관계를 설정할 때에 힘들었지만 정상적으로 구현되었을 때에 기분이 너무 좋았다. Finding: 알게 된 것 1. OneToMany의 한계점 및 ManyToOne의 장점(https://developerhun.tistory.com/110) 2. customException을 사용하는 이유는 예외명을 직관적으로 만들어 예외..

TIL, WIL 2023.07.30

[Springboot] OneToMany VS ManyToOne

Springboot에서 관계는 1:1, 1:N, N:1, N:M 관계가 있다. 이 중 OneToMany는 1:N을, ManyToOne은 N:1을 표현하는 어노테이션이다. 이 두개는 외래키의 위치가 다르며 게시글과 댓글로 예를 들자면 OneToMany는 게시글 안에 댓글을 포함시키는 것이고 외래키는 댓글이 가지게 된다. ManyToOne은 댓글이 하나의 게시글을 참조하는 것(가리키는 것)이며 외래키는 게시글이 가진다. OneToMany 외래키를 N에서 관리하지만 1에서 N쪽을 제어(CRUD)할 수 있기에 헷갈릴 수 있다. 테이블의 특정 레코드 삭제 및 업데이트시 모든 레코드를 확인해야 하는 문제가 발생할 수 있다. 연관관계 관리를 위해 추가로 UPDATE SQL이 실행된다 OneToMany 외래키를 1에서..

Springboot 2023.07.30

[CS] 정규화 및 반정규화

정규화: 잘못 설계된 관계형 스키마를 쪼개어 바람직한 스키마로 만들어 가는 과정 DB 논리적 설계단계에서 수행 수준이 높을수록 유연한 데이터 구축, 정확성 상승, 물리적 접근이 복잡, 조회 성능이 저하 정규화의 목적 : 단순화, 무결성, 안정성 어떠한 릴레이션이라도 DB 내에서 표현 가능 효과적인 검색 알고리즘 생성 가능 중복배제, 저장공간의 최소화 데이터 삽입 시 릴레이션을 재구성할 필요성을 줄임 정규화를 거치지 않을 시 데이터들이 불필요하게 중복되는 현상인 이상(Anomaly)이 발생할 수 있다. 삽입 이상 : 삽입 시 원하지 않은 값들도 함께 삽입되는 현상 삭제 이상 : 삭제 시 상관없는 값들도 함께 삭제되는 현상 갱신 이상 : 갱신 시 일부분만 갱신되어 정보에 모순이 생기는 현상 정규화의 원칙 스..

Springboot 2023.07.29

[WIL] week 6

Fact: 학습내용 이번주는 미니 프로젝트를 진행했다. 로그인 및 회원가입 부분을 담당했으며, RefreshToken을 사용하여 AccessToken을 재발급 하는 기능을 구현했다 Feeling: 느낀 점 1. 처음으로 강의에서 나오지 않은 기능을 찾아보며 직접 만들었기에 무사히 구현됐을 때 성취감이 매우 컸다. 2. 로그인이라는 기능이 이정도로 복잡할 줄은 몰랐다. 3. 기능구현도 쉽지 않았지만, 협업 진행간 크고작은 에러들 때문에 더욱 힘들었다. Finding: 알게 된 것 1. RefreshToken을 통한 AccessToken의 재발급 방법 2. Intellij와 Redis의 연동방법 3. 프로젝트 시작 전 명세의 중요성 3. 팀 프로젝트간 소통과 피드백의 중요성 Future: 알게된 것을 어떻게..

TIL, WIL 2023.07.23

[Springboot] DAO, DTO, VO

DAO DB의 data에 접근하기 위한 객체. DB에 접근 하기 위한 로직 & 비즈니스 로직을 분리하기 위해 사용한다. 직접 DB에 접근하여 data를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다. DTO 계층 간 데이터 교환을 하기 위해 사용하는 객체. 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스) VO VO(Value Object) 값 오브젝트로써 값을 위해 쓰임 read-Only DTO와 유사하지만 VO는 getter 기능만 존재한다 DTO와 VO 차이점 DTO는 인스턴스 개념이고 VO는 리터럴 값 개념이다. VO는 값들에 대해 Read-Only를 보장해줘야 존재의 신뢰성이 확보되지만 DTO의 경우는 단지 데이터를 담는 그릇의 역할일 뿐 값은 그저 ..

Springboot 2023.07.18

[Springboot] CORS란?

CORS(Cross Origin Resource Sharing): 도메인이 다른 자원에 리소스를 요청할 때 접근 권한을 부여하는 메커니즘 친구의 물건을 쓰려면 친구가 제한하는 규약안에서 사용해야 하듯, 다른 도메인의 자원을 쓰려면 자원의 주인이 허락한 규약을 지켜야 하는 것이고 이러한 규약을 표준화한 것이 CORS이 여기서 말하는 도메인이란 Resource를 의미하며 프로토콜, 호스트, 포트를 의미한다. (ex. http : 프로토콜, localhost : 호스트, 8080: 포트) 프로토콜 - http와 https 도메인 - domain.com, other-domain.com 포트 번호 - 8080, 7070 위의 3개가 같아야 같은 출처이다. SOP와 CORS 📌 SOP와 CORS에 대해서 설명해주세..

Springboot 2023.07.15