diff --git a/.gitignore b/.gitignore index 6cfef3db..3de52aa2 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ build/ src/main/resources/application.yml src/main/resources/application.properties .env +*.env deploy-* *TestController* *TestService* diff --git a/Dockerfile b/Dockerfile index 5953fd07..45839c9c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,48 +1,48 @@ -######### intellij 자체 빌드 후 데이터 추가 ############### -# 1. 공식 Tomcat 이미지 기반 (버전은 필요에 맞게 조정) +########## intellij 자체 빌드 후 데이터 추가 ############### +## 1. 공식 Tomcat 이미지 기반 (버전은 필요에 맞게 조정) +#FROM tomcat:9.0-jdk17 +# +## 2. 시간대 설정 (한국 시간) +#ENV TZ=Asia/Seoul +#RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +# +## 3. 기존 webapps 디렉토리 제거 (불필요한 기본 앱 제거) +#RUN rm -rf /usr/local/tomcat/webapps/* +# +#COPY build/libs/plan-it-1.0-SNAPSHOT.war /usr/local/tomcat/webapps/ROOT.war +# +#EXPOSE 8080 + + +######## container 자체 빌드 ############### +# 1) Builder 단계: Gradle + JDK17로 WAR 빌드 +FROM gradle:7.6-jdk17 AS builder +WORKDIR /home/gradle/project + +# 프로젝트 파일 전체를 복사 (캐시 효율보다 단순 호환성 우선) +COPY --chown=gradle:gradle . . + +# 테스트 제외하고 WAR 생성 +RUN gradle clean build -x test --no-daemon + +# 2) Run 단계: Tomcat에 WAR 배포 FROM tomcat:9.0-jdk17 -# 2. 시간대 설정 (한국 시간) +# 한국 시간대 설정 ENV TZ=Asia/Seoul -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ + && echo $TZ > /etc/timezone -# 3. 기존 webapps 디렉토리 제거 (불필요한 기본 앱 제거) +# 기본 웹앱 제거 RUN rm -rf /usr/local/tomcat/webapps/* -COPY build/libs/plan-it-1.0-SNAPSHOT.war /usr/local/tomcat/webapps/ROOT.war +# Builder 단계에서 생성된 WAR를 ROOT.war로 복사 +# 빌드 결과물 위치가 build/libs/*.war 라는 점에 유의 +COPY --from=builder /home/gradle/project/build/libs/*.war \ + /usr/local/tomcat/webapps/ROOT.war +# 컨테이너 노출 포트 EXPOSE 8080 - -######### container 자체 빌드 ############### -## 1) Builder 단계: Gradle + JDK17로 WAR 빌드 -#FROM gradle:7.6-jdk17 AS builder -#WORKDIR /home/gradle/project -# -## 프로젝트 파일 전체를 복사 (캐시 효율보다 단순 호환성 우선) -#COPY --chown=gradle:gradle . . -# -## 테스트 제외하고 WAR 생성 -#RUN gradle clean build -x test --no-daemon -# -## 2) Run 단계: Tomcat에 WAR 배포 -#FROM tomcat:9.0-jdk17 -# -## 한국 시간대 설정 -#ENV TZ=Asia/Seoul -#RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ -# && echo $TZ > /etc/timezone -# -## 기본 웹앱 제거 -#RUN rm -rf /usr/local/tomcat/webapps/* -# -## Builder 단계에서 생성된 WAR를 ROOT.war로 복사 -## 빌드 결과물 위치가 build/libs/*.war 라는 점에 유의 -#COPY --from=builder /home/gradle/project/build/libs/*.war \ -# /usr/local/tomcat/webapps/ROOT.war -# -## 컨테이너 노출 포트 -#EXPOSE 8080 -# -## Tomcat 기동 -#CMD ["catalina.sh", "run"] +# Tomcat 기동 +CMD ["catalina.sh", "run"] diff --git a/build.gradle b/build.gradle index f1394d13..b6a2f8c4 100644 --- a/build.gradle +++ b/build.gradle @@ -69,8 +69,8 @@ dependencies { implementation "org.springframework:spring-tx:${springVersion}" implementation "org.springframework:spring-jdbc:${springVersion}" - implementation 'org.mybatis:mybatis:3.4.6' - implementation 'org.mybatis:mybatis-spring:1.3.2' + implementation 'org.mybatis:mybatis:3.5.14' + implementation 'org.mybatis:mybatis-spring:2.1.2' implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4:1.16' implementation 'org.apache.logging.log4j:log4j-api:2.0.1' @@ -139,6 +139,8 @@ dependencies { implementation "io.micrometer:micrometer-core:1.13.1" implementation "io.micrometer:micrometer-registry-prometheus:1.13.1" implementation "io.micrometer:micrometer-jakarta9:1.13.1" + implementation 'io.micrometer:micrometer-core:1.7.6' + } diff --git a/src/main/java/woojooin/planit/domain/goal/action/domain/Action.java b/src/main/java/woojooin/planit/domain/goal/action/domain/Action.java index 95e6f783..ae652218 100644 --- a/src/main/java/woojooin/planit/domain/goal/action/domain/Action.java +++ b/src/main/java/woojooin/planit/domain/goal/action/domain/Action.java @@ -5,6 +5,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import woojooin.planit.domain.member.domain.MemberProduct; @Data @AllArgsConstructor @@ -20,6 +21,7 @@ public class Action { private String accountNumber; private Long memberProductId; + private MemberProduct memberProduct; private Integer allocatedRate; diff --git a/src/main/java/woojooin/planit/domain/goal/action/mapper/ActionMapper.java b/src/main/java/woojooin/planit/domain/goal/action/mapper/ActionMapper.java index 97234b36..d9803d0a 100644 --- a/src/main/java/woojooin/planit/domain/goal/action/mapper/ActionMapper.java +++ b/src/main/java/woojooin/planit/domain/goal/action/mapper/ActionMapper.java @@ -11,4 +11,6 @@ public interface ActionMapper { List findActionsByGoalId(Long goalId); int saveAll(List action); + + Action findByMemberProductId(Long memberProductId); } diff --git a/src/main/java/woojooin/planit/domain/goal/isa/dto/req/IsaAccountProductEditReq.java b/src/main/java/woojooin/planit/domain/goal/isa/dto/req/IsaAccountProductEditReq.java index 624bd5a7..6ca6f2d1 100644 --- a/src/main/java/woojooin/planit/domain/goal/isa/dto/req/IsaAccountProductEditReq.java +++ b/src/main/java/woojooin/planit/domain/goal/isa/dto/req/IsaAccountProductEditReq.java @@ -3,21 +3,17 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.NonNull; @Data @NoArgsConstructor @AllArgsConstructor public class IsaAccountProductEditReq { - @NonNull private Long goalId; - @NonNull private Long memberProductId; private String accountType = "ISA"; - @NonNull private boolean checked; } \ No newline at end of file diff --git a/src/main/java/woojooin/planit/domain/goal/mapper/GoalMapper.java b/src/main/java/woojooin/planit/domain/goal/mapper/GoalMapper.java index 1999b23c..881616d6 100644 --- a/src/main/java/woojooin/planit/domain/goal/mapper/GoalMapper.java +++ b/src/main/java/woojooin/planit/domain/goal/mapper/GoalMapper.java @@ -1,49 +1,48 @@ package woojooin.planit.domain.goal.mapper; -import org.apache.ibatis.annotations.MapKey; +import java.util.List; + import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; -import woojooin.planit.domain.goal.domain.Goal; // 변경된 Goal VO 임포트 +import woojooin.planit.domain.goal.domain.Goal; import woojooin.planit.domain.goal.domain.GoalProgress; - import woojooin.planit.domain.goal.dto.DepositAccountDto; import woojooin.planit.domain.goal.dto.IsaProductDto; import woojooin.planit.domain.goal.dto.res.GoalDepositResponse; import woojooin.planit.domain.goal.isa.dto.res.IsaAccountProductRes; -import woojooin.planit.domain.goal.deposit.dto.res.DepositAccountRes; - -import java.util.List; -import java.util.Map; @Mapper public interface GoalMapper { - int insertGoal(Goal goal); + Goal findById(@Param("id") long id); + + int insertGoal(Goal goal); - Goal selectGoalById(@Param("memberId") Long memberId,@Param("goalId") Long goalId); + Goal selectGoalById(@Param("memberId") Long memberId, @Param("goalId") Long goalId); - List selectAllGoals(Long memberId); + List selectAllGoals(Long memberId); - int updateGoal(Goal goal); + int updateGoal(Goal goal); - int deleteGoal(@Param("goalId") Long goalId, @Param("memberId") Long memberId); + int deleteGoal(@Param("goalId") Long goalId, @Param("memberId") Long memberId); - int softDeleteActionsByGoalId(@Param("goalId") Long goalId, @Param("memberId") Long memberId); + int softDeleteActionsByGoalId(@Param("goalId") Long goalId, @Param("memberId") Long memberId); - List findAllocatedIsaByGoal(@Param("memberId") Long memberId, @Param("goalId") Long goalId); + List findAllocatedIsaByGoal(@Param("memberId") Long memberId, @Param("goalId") Long goalId); - List findAllocatedDepositByGoal(@Param("memberId") Long memberId, @Param("goalId") Long goalId); + List findAllocatedDepositByGoal(@Param("memberId") Long memberId, + @Param("goalId") Long goalId); - List selectDepositAccountsByGoalId(Long goalId); + List selectDepositAccountsByGoalId(Long goalId); - List selectIsaProductsByGoalId(Long goalId); + List selectIsaProductsByGoalId(Long goalId); - // 목표 금액 조회 - Long selectGoalTargetAmount(Long goalId); + // 목표 금액 조회 + Long selectGoalTargetAmount(Long goalId); - List selectGoalProgressByGoalId(@Param("goalId") Long goalId); + List selectGoalProgressByGoalId(@Param("goalId") Long goalId); - List selectDailyGoalProgressLast6Months(@Param("goalId") Long goalId); + List selectDailyGoalProgressLast6Months(@Param("goalId") Long goalId); } diff --git a/src/main/java/woojooin/planit/domain/member/domain/Member.java b/src/main/java/woojooin/planit/domain/member/domain/Member.java index cdbb3b2b..a50e1ff4 100644 --- a/src/main/java/woojooin/planit/domain/member/domain/Member.java +++ b/src/main/java/woojooin/planit/domain/member/domain/Member.java @@ -30,4 +30,5 @@ public class Member { private Double liquid; private Double growth; private Double diversified; + private String fcmToken; } diff --git a/src/main/java/woojooin/planit/domain/member/domain/MemberProduct.java b/src/main/java/woojooin/planit/domain/member/domain/MemberProduct.java index 8ced397d..5216dbdb 100644 --- a/src/main/java/woojooin/planit/domain/member/domain/MemberProduct.java +++ b/src/main/java/woojooin/planit/domain/member/domain/MemberProduct.java @@ -2,11 +2,13 @@ import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import woojooin.planit.domain.goal.action.domain.Action; import woojooin.planit.domain.product.domain.ProductTypeCode; @Data @@ -14,10 +16,11 @@ @NoArgsConstructor @AllArgsConstructor public class MemberProduct { - private Long memberProductId; private Long memberId; private Long accountId; + private List actionList; + private Member member; // ==== 상품 정보 ==== private ProductTypeCode productTypeCode; // 상품유형코드 diff --git a/src/main/java/woojooin/planit/domain/member/mapper/MemberMapper.java b/src/main/java/woojooin/planit/domain/member/mapper/MemberMapper.java index ec894231..9466f02c 100644 --- a/src/main/java/woojooin/planit/domain/member/mapper/MemberMapper.java +++ b/src/main/java/woojooin/planit/domain/member/mapper/MemberMapper.java @@ -1,21 +1,27 @@ package woojooin.planit.domain.member.mapper; import org.apache.ibatis.annotations.Param; + import woojooin.planit.domain.member.domain.Member; public interface MemberMapper { - Member findById(Long memberId); - Member findByEmail(String email); - void insert(Member member); - void update(Member member); - void delete(Long memberId); - - void updateInvestType(@Param("memberId") Long memberId, @Param("type") String type); - - String findByConnectedIdString(@Param("memberId") Long memberId); - - void updateConnectedId(@Param("memberId") Long memberId, @Param("connectedId") String connectedId); - String findInvestTypeById(@Param("memberId") Long memberId); - - void updateIsaType(@Param("memberId") Long memberId, @Param("isaType") String isaType); + Member findById(Long memberId); + + Member findByEmail(String email); + + void insert(Member member); + + void update(Member member); + + void delete(Long memberId); + + void updateInvestType(@Param("memberId") Long memberId, @Param("type") String type); + + String findByConnectedIdString(@Param("memberId") Long memberId); + + void updateConnectedId(@Param("memberId") Long memberId, @Param("connectedId") String connectedId); + + String findInvestTypeById(@Param("memberId") Long memberId); + + void updateIsaType(@Param("memberId") Long memberId, @Param("isaType") String isaType); } \ No newline at end of file diff --git a/src/main/java/woojooin/planit/domain/member/mapper/MemberProductMapper.java b/src/main/java/woojooin/planit/domain/member/mapper/MemberProductMapper.java index 26d723c8..f9f16d85 100644 --- a/src/main/java/woojooin/planit/domain/member/mapper/MemberProductMapper.java +++ b/src/main/java/woojooin/planit/domain/member/mapper/MemberProductMapper.java @@ -7,11 +7,14 @@ import woojooin.planit.domain.member.domain.MemberProduct; public interface MemberProductMapper { + + MemberProduct findById(@Param("id") Long memberProductId); + void insert(MemberProduct memberProduct); void insertBatch(List memberProducts); - MemberProduct findByMemberId(@Param("memberProductId") Long memberProductId); + MemberProduct findByMemberProductId(@Param("memberProductId") Long memberProductId); List select(Long memberId); } diff --git a/src/main/java/woojooin/planit/domain/product/mapper/ProductMapper.java b/src/main/java/woojooin/planit/domain/product/mapper/ProductMapper.java index b781ab13..6bc00a71 100644 --- a/src/main/java/woojooin/planit/domain/product/mapper/ProductMapper.java +++ b/src/main/java/woojooin/planit/domain/product/mapper/ProductMapper.java @@ -2,6 +2,8 @@ import java.util.List; +import org.apache.ibatis.annotations.Param; + import woojooin.planit.domain.product.domain.Product; public interface ProductMapper { @@ -10,5 +12,8 @@ public interface ProductMapper { Product selectBySrtnCd(String srtncd); Product findByProductId(Long productId); + + Product findByShortenCode(@Param("shortenCode") String shortenCode); + Long selectProductIdByItemName(String itemName); } diff --git a/src/main/java/woojooin/planit/domain/rebalance/mapper/RebalanceMapper.java b/src/main/java/woojooin/planit/domain/rebalance/mapper/RebalanceMapper.java index 284b2951..a5548f2c 100644 --- a/src/main/java/woojooin/planit/domain/rebalance/mapper/RebalanceMapper.java +++ b/src/main/java/woojooin/planit/domain/rebalance/mapper/RebalanceMapper.java @@ -11,6 +11,8 @@ @Mapper public interface RebalanceMapper { + Rebalance findById(@Param("id") long id); + /** 단일 리밸런싱 내역 저장 */ int insert(Rebalance rebalance); diff --git a/src/main/java/woojooin/planit/domain/rebalance/vo/Rebalance.java b/src/main/java/woojooin/planit/domain/rebalance/vo/Rebalance.java index 5f729712..b5e7add5 100644 --- a/src/main/java/woojooin/planit/domain/rebalance/vo/Rebalance.java +++ b/src/main/java/woojooin/planit/domain/rebalance/vo/Rebalance.java @@ -6,6 +6,9 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import woojooin.planit.domain.goal.domain.Goal; +import woojooin.planit.domain.member.domain.MemberProduct; +import woojooin.planit.domain.product.domain.Product; import woojooin.planit.domain.rebalance.enums.InvestType; @Data @@ -13,6 +16,11 @@ @AllArgsConstructor @NoArgsConstructor public class Rebalance { + + private Goal goal; + private Product product; + private MemberProduct memberProduct; + private Long rebalanceId; private String productCode; private Long memberProductId; diff --git a/src/main/java/woojooin/planit/global/util/rabbitMQ/GoalMsg.java b/src/main/java/woojooin/planit/global/util/rabbitMQ/GoalMsg.java index 43c0d877..e201104f 100644 --- a/src/main/java/woojooin/planit/global/util/rabbitMQ/GoalMsg.java +++ b/src/main/java/woojooin/planit/global/util/rabbitMQ/GoalMsg.java @@ -10,7 +10,7 @@ public class GoalMsg { private Long memberId; - private Long goalId; private String goalName; private Integer achievementRate; + private Integer tryCount; } diff --git a/src/main/resources/mapper/ActionMapper.xml b/src/main/resources/mapper/ActionMapper.xml index 2283d18f..91b9c1e2 100644 --- a/src/main/resources/mapper/ActionMapper.xml +++ b/src/main/resources/mapper/ActionMapper.xml @@ -18,6 +18,12 @@ + + - SELECT * FROM member WHERE member_id = #{memberId} + SELECT * + FROM member + WHERE member_id = #{memberId} - - INSERT INTO member ( - role, connected_id, reward_cnt, social_id, auth_vender, - invest_type, last_visit, email, password, benefit, nickname - ) VALUES ( - #{role}, #{connectedId}, #{rewardCnt}, #{socialId}, #{authVender}, - #{investType}, #{lastVisit}, #{email}, #{password}, #{benefit}, #{nickname} - ) + + INSERT INTO member (member_id, role, connected_id, reward_cnt, social_id, auth_vender, + invest_type, last_visit, email, password, benefit, nickname) + VALUES (${memberId}, #{role}, #{connectedId}, #{rewardCnt}, #{socialId}, #{authVender}, + #{investType}, #{lastVisit}, #{email}, #{password}, #{benefit}, #{nickname}) UPDATE member - SET role = #{role}, + SET role = #{role}, connected_id = #{connectedId}, - reward_cnt = #{rewardCnt}, - social_id = #{socialId}, - auth_vender = #{authVender}, - invest_type = #{investType}, - last_visit = #{lastVisit}, - email = #{email}, - password = #{password}, - benefit = #{benefit}, - nickname = #{nickname} + reward_cnt = #{rewardCnt}, + social_id = #{socialId}, + auth_vender = #{authVender}, + invest_type = #{investType}, + last_visit = #{lastVisit}, + email = #{email}, + password = #{password}, + benefit = #{benefit}, + nickname = #{nickname} WHERE member_id = #{memberId} - DELETE FROM member WHERE member_id = #{memberId} + DELETE + FROM member + WHERE member_id = #{memberId} @@ -67,7 +72,7 @@ SET invest_type = #{type} WHERE member_id = #{memberId} - + UPDATE member SET connected_id = #{connectedId} @@ -75,10 +80,11 @@ - + UPDATE member SET isa_type = #{isaType} diff --git a/src/main/resources/mapper/MemberProductMapper.xml b/src/main/resources/mapper/MemberProductMapper.xml index 53e27de5..244dbb65 100644 --- a/src/main/resources/mapper/MemberProductMapper.xml +++ b/src/main/resources/mapper/MemberProductMapper.xml @@ -3,6 +3,50 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/src/main/resources/mapper/ProductMapper.xml b/src/main/resources/mapper/ProductMapper.xml index b04b1cfe..ddef5700 100644 --- a/src/main/resources/mapper/ProductMapper.xml +++ b/src/main/resources/mapper/ProductMapper.xml @@ -30,15 +30,20 @@ WHERE product_id = #{productId} + + diff --git a/src/main/resources/mapper/RebalanceMapper.xml b/src/main/resources/mapper/RebalanceMapper.xml index 54e68bac..3ea5399d 100644 --- a/src/main/resources/mapper/RebalanceMapper.xml +++ b/src/main/resources/mapper/RebalanceMapper.xml @@ -4,6 +4,53 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + - select item_name, quantity, valuation_amount, diff --git a/src/main/resources/mapper/goal/GoalMapper.xml b/src/main/resources/mapper/goal/GoalMapper.xml index 638807c5..e6c9310f 100644 --- a/src/main/resources/mapper/goal/GoalMapper.xml +++ b/src/main/resources/mapper/goal/GoalMapper.xml @@ -17,113 +17,127 @@ - - insert into `goal` (member_id, goal_name, target_amount, start_date, end_date, - deposit_rate, isa_rate, start_amount, goal_rate - ) - VALUES ( - #{memberId}, #{goalName}, #{targetAmount}, #{startDate}, #{endDate}, - #{depositRate}, #{isaRate}, #{startAmount}, #{goalRate} - ) + + + + + insert into `goal` (member_id, goal_name, target_amount, start_date, end_date, + deposit_rate, isa_rate, start_amount, goal_rate) + VALUES (#{memberId}, #{goalName}, #{targetAmount}, #{startDate}, #{endDate}, + #{depositRate}, #{isaRate}, #{startAmount}, #{goalRate}) UPDATE `goal` - SET - goal_name = #{goalName}, + SET goal_name = #{goalName}, target_amount = #{targetAmount}, - start_date = #{startDate}, - end_date = #{endDate}, - isa_rate = #{isaRate}, - deposit_rate = #{depositRate}, - start_amount = #{startAmount}, - goal_rate = #{goalRate} - WHERE goal_id = #{goalId} AND member_id = #{memberId} + start_date = #{startDate}, + end_date = #{endDate}, + isa_rate = #{isaRate}, + deposit_rate = #{depositRate}, + start_amount = #{startAmount}, + goal_rate = #{goalRate} + WHERE goal_id = #{goalId} + AND member_id = #{memberId} /*goal.getGoaldID*/ - + SELECT goal_id, + member_id, + goal_name, + target_amount, + start_date, + end_date, + deposit_rate, + isa_rate, + start_amount, + goal_rate FROM `goal` - WHERE goal_id = #{goalId} AND member_id = #{memberId} + WHERE goal_id = #{goalId} + AND member_id = #{memberId} - - delete from `goal` - where goal_id = #{goalId} AND member_id = #{memberId} + + delete + from `goal` + where goal_id = #{goalId} + AND member_id = #{memberId} - + UPDATE `action` SET is_deleted = 1 - WHERE goal_id = #{goalId} AND member_id = #{memberId} + WHERE goal_id = #{goalId} + AND member_id = #{memberId} @@ -135,24 +149,22 @@ - SELECT mp.present_amount AS presentAmount, - mp.quantity AS quantity + mp.quantity AS quantity FROM member_product mp JOIN action act ON mp.member_product_id = act.member_product_id JOIN account a ON act.account_id = a.account_id diff --git a/src/main/resources/mybatis-config.xml b/src/main/resources/mybatis-config.xml index 78b7e779..7b7b8387 100644 --- a/src/main/resources/mybatis-config.xml +++ b/src/main/resources/mybatis-config.xml @@ -6,6 +6,8 @@ + +