Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,6 @@ dependencies {
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"


// kafka
implementation 'org.springframework.kafka:spring-kafka'
implementation 'org.springframework.kafka:spring-kafka-test'

// redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

Expand Down
40 changes: 1 addition & 39 deletions docker-compose.prod.yml
Original file line number Diff line number Diff line change
@@ -1,39 +1,4 @@
services:
kafka-1:
image: confluentinc/cp-kafka:latest
container_name: kafka-1
ports:
- "29092:29092"
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka-1:9093'
KAFKA_LISTENERS: 'PLAINTEXT://kafka-1:9092,CONTROLLER://kafka-1:9093,PLAINTEXT_HOST://0.0.0.0:29092'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka-1:9092,PLAINTEXT_HOST://${EC2_PRIVATE_IP}:29092'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
CLUSTER_ID: 'ciWo7IWazngRchmPES6q5A=='
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
networks:
- app-network

kafka-ui:
image: provectuslabs/kafka-ui:latest
container_name: kafka-ui
ports:
- "8090:8080"
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka-1:9092
depends_on:
- kafka-1
networks:
- app-network

redis:
image: redis:7-alpine
container_name: redis
Expand All @@ -57,7 +22,6 @@ services:
- "80:8080"
environment:
SPRING_PROFILES_ACTIVE: prod
SPRING_KAFKA_BOOTSTRAP_SERVERS: kafka-1:9092
DB_HOST: ${DB_HOST}
DB_PORT: ${DB_PORT}
DB_NAME: ${DB_NAME}
Expand All @@ -66,8 +30,6 @@ services:
depends_on:
redis:
condition: service_healthy
kafka-1:
condition: service_started
restart: unless-stopped
networks:
- app-network
Expand All @@ -77,4 +39,4 @@ volumes:

networks:
app-network:
driver: bridge
driver: bridge
Original file line number Diff line number Diff line change
@@ -1,17 +1,11 @@
package com.practice.course_registration.domain.member.domain;

import com.practice.course_registration.domain.subject.domain.LikeSubject;
import com.practice.course_registration.domain.subject.domain.MemberSubject;
import com.practice.course_registration.global.common.BaseEntity;
import com.practice.course_registration.global.enums.Role;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.ColumnDefault;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
Expand Down Expand Up @@ -45,12 +39,6 @@ public class Member extends BaseEntity {
@Enumerated(EnumType.STRING)
private Role role;

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
List<MemberSubject> memberSubjects = new ArrayList<>();

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
List<LikeSubject> likeSubjects = new ArrayList<>();

public Member(String memberName, String memberNumber, int grade, String loginId, String password) {
this.memberName = memberName;
this.memberNumber = memberNumber;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,11 @@
package com.practice.course_registration.domain.member.repository;

import com.practice.course_registration.domain.member.domain.Member;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface MemberRepository extends JpaRepository<Member, Long> {
boolean existsByLoginId(String loginId);
boolean existsByMemberNumber(String memberNumber);

Member findByLoginId(String loginId);

@Query("select m from Member m " +
"left join fetch m.memberSubjects " +
"where m.id = :id")
Optional<Member> findWithSubjectsById(@Param("id") Long id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import com.practice.course_registration.domain.subject.service.SubjectQueryService;
import com.practice.course_registration.domain.subject.service.SubjectService;
import com.practice.course_registration.global.apiPayload.exception.handler.ErrorHandler;
import com.practice.course_registration.global.kafka.KafkaProducer;
import com.practice.course_registration.global.redis.service.WaitQueueService;
import com.practice.course_registration.global.redis.utils.RedisKeyUtils;
import com.practice.course_registration.global.security.utils.SecurityUtils;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.practice.course_registration.domain.subject.domain;

import com.practice.course_registration.domain.member.domain.Member;
import com.practice.course_registration.global.common.BaseEntity;
import jakarta.persistence.*;
import lombok.*;
Expand All @@ -16,13 +15,12 @@ public class LikeSubject extends BaseEntity {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
// FK 연관 없이 ID로만 참조
@Column(name = "member_id", nullable = false)
private Long memberId;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "subject_id")
private Subject subject;
@Column(name = "subject_id", nullable = false)
private Long subjectId;

@Column(nullable = false)
private Boolean isRegistration;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.practice.course_registration.domain.subject.domain;

import com.practice.course_registration.domain.member.domain.Member;
import com.practice.course_registration.global.common.BaseEntity;
import jakarta.persistence.*;
import lombok.*;
Expand All @@ -16,12 +15,11 @@ public class MemberSubject extends BaseEntity {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "member_id")
private Member member;
// FK 연관 없이 ID로만 참조
@Column(name = "member_id", nullable = false)
private Long memberId;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "subject_id")
private Subject subject;
@Column(name = "subject_id", nullable = false)
private Long subjectId;
}

Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,8 @@
import com.practice.course_registration.global.enums.SubjectDay;
import jakarta.persistence.*;
import lombok.*;
import org.springframework.boot.context.properties.bind.DefaultValue;

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;

@Entity
@AllArgsConstructor
Expand Down Expand Up @@ -43,15 +40,6 @@ public class Subject extends BaseEntity {

private LocalTime endTime;

@OneToMany(mappedBy = "subject", cascade = CascadeType.ALL)
@Builder.Default
private List<MemberSubject> memberSubjects = new ArrayList<>();

@OneToMany(mappedBy = "subject", cascade = CascadeType.ALL)
@Builder.Default
private List<LikeSubject> likeSubjects = new ArrayList<>();


public boolean conflictCheck(Subject subject) {
return this.getStartTime().isBefore(subject.getEndTime())
&& this.getEndTime().isAfter(subject.getStartTime());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,38 @@
package com.practice.course_registration.domain.subject.repository;

import com.practice.course_registration.domain.member.domain.Member;
import com.practice.course_registration.domain.subject.domain.LikeSubject;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;
import java.util.Set;

public interface LikeSubjectRepository extends JpaRepository<LikeSubject, Long> {

@Query("""
SELECT ls.subject.id
FROM LikeSubject ls
WHERE ls.member = :member AND ls.subject.id IN :subjectIds
""")
Set<Long> findAllByMemberAndSubject(@Param("member") Member member, @Param("subjectIds") List<Long> subjectIds);


List<LikeSubject> findByMemberId(Long memberId);

@Query("SELECT ls FROM LikeSubject ls JOIN FETCH ls.subject s WHERE ls.member.id = :memberId ORDER BY s.subjectName")
Page<LikeSubject> findByMemberIdOrderBySubjectAsc(@Param("memberId") Long memberId, Pageable pageable);

@Modifying
@Query("DELETE FROM LikeSubject ls WHERE ls.member.id = :memberId AND ls.subject.id = :subjectId")
void deleteByMemberIdAndSubjectId(@Param("memberId") Long memberId, @Param("subjectId") Long subjectId);

Optional<LikeSubject> findByMemberIdAndSubjectId(Long memberId, Long subjectId);
}
package com.practice.course_registration.domain.subject.repository;

import com.practice.course_registration.domain.subject.domain.LikeSubject;
import com.practice.course_registration.domain.subject.domain.Subject;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;
import java.util.Set;

public interface LikeSubjectRepository extends JpaRepository<LikeSubject, Long> {

@Query("""
SELECT ls.subjectId
FROM LikeSubject ls
WHERE ls.memberId = :memberId AND ls.subjectId IN :subjectIds
""")
Set<Long> findAllByMemberIdAndSubject(@Param("memberId") Long memberId, @Param("subjectIds") List<Long> subjectIds);


List<LikeSubject> findByMemberId(Long memberId);

// 연관관계 없이 id로 조인하여 찜한 과목을 과목명순으로 조회
@Query(value = "SELECT s FROM Subject s, LikeSubject ls WHERE ls.subjectId = s.id AND ls.memberId = :memberId ORDER BY s.subjectName",
countQuery = "SELECT count(ls) FROM LikeSubject ls WHERE ls.memberId = :memberId")
Page<Subject> findLikedSubjectsByMemberIdOrderByName(@Param("memberId") Long memberId, Pageable pageable);

@Modifying
@Query("DELETE FROM LikeSubject ls WHERE ls.memberId = :memberId AND ls.subjectId = :subjectId")
void deleteByMemberIdAndSubjectId(@Param("memberId") Long memberId, @Param("subjectId") Long subjectId);

Optional<LikeSubject> findByMemberIdAndSubjectId(Long memberId, Long subjectId);
}
Original file line number Diff line number Diff line change
@@ -1,34 +1,30 @@
package com.practice.course_registration.domain.subject.repository;

import com.practice.course_registration.domain.member.domain.Member;
import com.practice.course_registration.domain.subject.domain.MemberSubject;
import com.practice.course_registration.domain.subject.domain.Subject;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;
import java.util.Set;

public interface MemberSubjectRepository extends JpaRepository<MemberSubject, Long> {

@Query("""
SELECT ms.subject.id
FROM MemberSubject ms
WHERE ms.member = :member AND ms.subject.id IN :subjectIds
""")
Set<Long> findAllIdByMemberAndSubject(@Param("member") Member member, @Param("subjectIds") List<Long> subjectIds);

Optional<MemberSubject> findByMemberAndSubject(Member member, Subject subject);

Optional<MemberSubject> findByMemberIdAndSubjectId(Long memberId, Long subjectId);

List<MemberSubject> findAllByMember(Member member);

@Modifying
@Query("delete from MemberSubject ms where ms.member.id = :memberId and ms.subject.id = :subjectId")
void deleteByMemberIdAndSubjectId(@Param("memberId") Long memberId, @Param("subjectId") Long subjectId);

}
package com.practice.course_registration.domain.subject.repository;

import com.practice.course_registration.domain.subject.domain.MemberSubject;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;
import java.util.Set;

public interface MemberSubjectRepository extends JpaRepository<MemberSubject, Long> {

@Query("""
SELECT ms.subjectId
FROM MemberSubject ms
WHERE ms.memberId = :memberId AND ms.subjectId IN :subjectIds
""")
Set<Long> findAllIdByMemberIdAndSubject(@Param("memberId") Long memberId, @Param("subjectIds") List<Long> subjectIds);

Optional<MemberSubject> findByMemberIdAndSubjectId(Long memberId, Long subjectId);

List<MemberSubject> findAllByMemberId(Long memberId);

@Modifying
@Query("delete from MemberSubject ms where ms.memberId = :memberId and ms.subjectId = :subjectId")
void deleteByMemberIdAndSubjectId(@Param("memberId") Long memberId, @Param("subjectId") Long subjectId);

}
Loading
Loading