Skip to content

Commit

Permalink
Merge branch 'Study-Diary:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
jiwon83 authored Oct 20, 2024
2 parents 84ea0aa + 9ca1d38 commit bda6595
Show file tree
Hide file tree
Showing 94 changed files with 2,225 additions and 4 deletions.
2 changes: 1 addition & 1 deletion .$썸네일.drawio.bkp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<mxfile host="Electron" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.8 Chrome/128.0.6613.36 Electron/32.0.1 Safari/537.36" version="24.7.8" pages="4">
<diagram name="김정욱" id="46ABfGW5XwZKZhrFsjH7">
<mxGraphModel dx="2868" dy="1708" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1080" math="0" shadow="0">
<mxGraphModel dx="2206" dy="1314" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1080" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
Expand Down
130 changes: 130 additions & 0 deletions 241003/.$Spring Batch 01.drawio.bkp

Large diffs are not rendered by default.

Binary file added 241003/ORM.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
130 changes: 130 additions & 0 deletions 241003/Spring Batch 01.drawio

Large diffs are not rendered by default.

Binary file added 241003/Spring Batch 01.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added 241003/Spring SSE.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added 241003/캐시 전략.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added 241010/Mutex, Sempahore, Lock.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added 241010/redis.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added 241010/디자인패턴 - 전략패턴.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
37 changes: 37 additions & 0 deletions 241020/redislockmanger/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/
1 change: 1 addition & 0 deletions 241020/redislockmanger/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Spring Cloud Passport
34 changes: 34 additions & 0 deletions 241020/redislockmanger/application/member-service/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
group = 'com.seikim'
version = '0.0.1'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}

dependencies {
/* Project */
implementation project(':client:web-core')
implementation project(':common:exception')
implementation project(':domain:mysql-core')
implementation project(':domain:mysql-member-domain')
implementation project(':domain:redis-red-lock')

/* Spring Cloud */
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'

/* Spring Boot */
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'

/* Test */
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
testImplementation 'org.mockito:mockito-core'

/* Project */
implementation project(':domain:mysql-member-domain')
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.seikim;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication(scanBasePackages = "com.seikim")
@ConfigurationPropertiesScan(value = "com.seikim")
public class MemberServiceApplication {

public static void main(String[] args) {
SpringApplication.run(MemberServiceApplication.class, args);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.seikim.memberservice.actuator;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;

import com.seikim.memberservice.common.MemberRestController;

@MemberRestController
public class RouterController {

@GetMapping("/v1/actuator/route")
public ResponseEntity<String> routeCheck() {
return ResponseEntity.ok("Route is OK");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.seikim.memberservice.common;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@RequestMapping("/member-service")
@ResponseBody
public @interface MemberRestController {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.seikim.memberservice.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;

import com.seikim.memberservice.common.MemberRestController;
import com.seikim.memberservice.dto.MemberSaveRequest;
import com.seikim.memberservice.service.MemberService;
import com.seikim.mysqlmemberdomain.domain.Member;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@MemberRestController
public class MemberController {
private final MemberService memberService;

@PostMapping("/v1/member/save")
public ResponseEntity<Integer> save(@RequestBody final MemberSaveRequest request) {
int savedMemberId = memberService.save(request);
return ResponseEntity.status(HttpStatus.CREATED).body(savedMemberId);
}

@PutMapping("/v1/member/{memberId}/like")
public ResponseEntity<Integer> likeCount(@PathVariable final int memberId) {
int likeCount = memberService.addLikeCount(memberId);
return ResponseEntity.ok(likeCount);
}

@GetMapping("/v1/member/{memberId}")
public ResponseEntity<Member> get(@PathVariable final int memberId) {
Member findMember = memberService.findById(memberId);
return ResponseEntity.ok(findMember);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.seikim.memberservice.dto;

import com.seikim.mysqlmemberdomain.domain.Member;

public record MemberSaveRequest(
String email,
String username
) {
public Member toMember() {
return new Member(email, username);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.seikim.memberservice.service;

import com.seikim.memberservice.dto.MemberSaveRequest;
import com.seikim.mysqlmemberdomain.domain.Member;

public interface MemberService {

int save(MemberSaveRequest request);

int addLikeCount(int memberId);

Member findById(int memberId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.seikim.memberservice.service.impl;

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.seikim.memberservice.dto.MemberSaveRequest;
import com.seikim.memberservice.service.MemberService;
import com.seikim.memberservice.service.utils.MemberServiceUtils;
import com.seikim.mysqlmemberdomain.domain.Member;
import com.seikim.mysqlmemberdomain.repository.MemberRepository;
import com.seikim.redisredlock.RedissonLock;

import lombok.RequiredArgsConstructor;

@Primary
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Service
public class MemberLockServiceImpl implements MemberService {

private final MemberRepository memberRepository;

@RedissonLock(key = "#memberId")
@Transactional
@Override
public int addLikeCount(final int memberId) {
Member findMember = MemberServiceUtils.findById(memberRepository, memberId);
findMember.addLikeCount();
return findMember.getLikeCount();
}

@Transactional
@Override
public int save(final MemberSaveRequest request) {
Member member = request.toMember();
Member savedMember = memberRepository.save(member);
return savedMember.getId();
}

@Override
public Member findById(int memberId) {
return MemberServiceUtils.findById(memberRepository, memberId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.seikim.memberservice.service.impl;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.seikim.memberservice.dto.MemberSaveRequest;
import com.seikim.memberservice.service.MemberService;
import com.seikim.memberservice.service.utils.MemberServiceUtils;
import com.seikim.mysqlmemberdomain.domain.Member;
import com.seikim.mysqlmemberdomain.repository.MemberRepository;

import lombok.RequiredArgsConstructor;

@Transactional(readOnly = true)
@RequiredArgsConstructor
@Service
public class MemberServiceImpl implements MemberService {

private final MemberRepository memberRepository;

@Transactional
@Override
public int addLikeCount(final int memberId) {
Member findMember = MemberServiceUtils.findById(memberRepository, memberId);
findMember.addLikeCount();
return findMember.getLikeCount();
}

@Transactional
@Override
public int save(final MemberSaveRequest request) {
Member member = request.toMember();
Member savedMember = memberRepository.save(member);
return savedMember.getId();
}

@Override
public Member findById(int memberId) {
return MemberServiceUtils.findById(memberRepository, memberId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.seikim.memberservice.service.utils;

import com.seikim.mysqlmemberdomain.domain.Member;
import com.seikim.mysqlmemberdomain.repository.MemberRepository;

public class MemberServiceUtils {
private MemberServiceUtils() {
throw new IllegalStateException("Utility class");
}

public static Member findById(MemberRepository memberRepository, int id) {
return memberRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("Member not found"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
eureka:
instance:
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
hostname: 127.0.0.1
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka/
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
spring:
jpa:
open-in-view: false
---
spring:
config:
activate:
on-profile:
- local
- default
jpa:
properties:
hibernate:
show_sql: true
format_sql: true
hibernate:
ddl-auto: create-drop
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:db
username: sa
password:
h2:
console:
enabled: true
path: /h2
---
spring:
config:
activate:
on-profile:
- mysql
jpa:
# properties:
# hibernate:
# show_sql: true
# format_sql: true
hibernate:
ddl-auto: create
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3307/redis
username: root
password: 1234
---
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
spring:
data:
redis:
host: localhost
port: 6379
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
server:
port: 0

spring:
application:
name: member-service
config:
import:
- application-eureka.yml
- application-mysql.yml
- application-redis.yml
Loading

0 comments on commit bda6595

Please sign in to comment.