Springboot 22

[Security] Spring Security의 흐름

사용된 Class1. WebSecurityConfig2. JwtUtil3. JwtAuthenticationFilter4. JwtAuthorizationFilter5. AuthExceptionFilter   1. WebSecurityConfig (Security 설정 로드)@EnableWebSecurity 를 통한 웹 보안 활성화WebSecurityConfig- CorsConfigurationSource: CORS 에서 허용할 오리진, 메서드, 헤더 등을 설정- PasswordEncoder: BCryptPasswordEncoder를 통한 비밀번호 암호화- AuthenticationManager: 로그인 인증을 처리하는 핵심 컴포넌트인 `AuthenticationManager`를 설정 - JwtAuthent..

Springboot 2024.06.22

[Springboot] JWT 0.15.2

이번 프로젝트에서는 최신 기술스택을 사용하기로 하였기에,이전에는 jwt 0.11.5 버전을 사용하였으나 이번에는 2024년 기준 최신 버전인 0.15.2 버전을 사용하기로 했다. maven Repository: https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api gradle implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.12.5' runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.12.5' runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-ja..

Springboot 2024.06.22

[Springboot] QueryDSL 2

어제는 랜덤 물품을 유저에게 보여줬다면 오늘은 중복된 물품을 주지 않도록 로직을 짰다. User와 Rating 테이블 간 다대다 관계여서 중간테이블(userRatingRelationRepository)을 만든 후 진행했다. RatingService @Transactional public ApiResponse randomRatingGoods(Long userId) { Set UserRatedGoods = userRatingRelationRepository.findUserCheckedGoodsByUserId(userId); Rating rating = ratingRepository.findRandomRatingWithCountLessThanOrEqual7(UserRatedGoods); User user = ..

Springboot 2023.08.09

[Springboot] QueryDSL

물물교환 프로젝트 진행 간 경매 시스템을 추가하기로 했다. 찾아보니 경매에서는 하한가가 필요했다. 하한가 설정을 위해 팀원끼리 많이 고민했으나 우선은 등록한 물건의 가격을 랜덤한 유저가 적절하다고 판단하는 값을 입력하게 하여 평균값을 산출 후 하한가로 적용하기로 했다. gradle.build dependencies { implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jak..

Springboot 2023.08.08

[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

[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