반응형

https://www.acmicpc.net/problem/1085

import java.util.Scanner;
public class Main {
    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        int h=0;
        int w=0;
        int x=0;
        int y=0;
        while(scanner.hasNextInt()){
        x = scanner.nextInt();
        y = scanner.nextInt();
        w = scanner.nextInt();
        h = scanner.nextInt();
        }
        int m1 = Math.min(h-y,y);
        int m2 = Math.min(w-x,x);
    

      System.out.println(Math.min(m1,m2));
    }
}

 

* 학습내용

1. 두 수 중에 최소값 구하기

Math.min(X,Y)

Math 자체를 너무 오랜만에 써봄...

 

2. 입력받기

Scanner sc = new Scanner(System.in);

정수 입력받기 : sc.nextInt();

문자열 입력받기 : sc.nextLine();

입력도 받아볼 일이 없어서 써본 기억이 가물가물...

반응형

'코딩 관련 > 코딩문제풀기' 카테고리의 다른 글

[JAVA] 9012번 괄호  (0) 2023.03.13
[JAVA] 너의 평점은  (0) 2023.03.12
[JAVA] 그룹 단어 체커  (0) 2023.03.12
[JAVA] 크로아티아 알파벳  (0) 2023.03.11
[JAVA] 4344번 평균은 넘겠지 문제  (0) 2023.03.09
반응형

https://www.acmicpc.net/problem/4344

import java.util.Scanner;

public class MyClass {
    public static void main(String args[]) {
      Scanner sc = new Scanner(System.in);
      int testcase = sc.nextInt();  //케이스 수
      for(int i=1;i<=testcase;i++){
          int students = sc.nextInt();
          int[] student = new int[students];
          int sum=0;
          for(int s=0;s<students;s++){
              student[s] = sc.nextInt();
              
              sum+= student[s];
          }
          float avg= sum/students;
         
          int over=0;
          for(int s=0;s<students;s++){
              if(student[s]>avg){
                  over +=1;
              }
          }
            float percent = (float)over/(float)students * 100;
          System.out.printf("%.3f",percent);
          System.out.print("%\n");
      }
    }
}

 

* 학습내용

1.  float : 소수점 7자리까지 표현

double : 소수점 16자리까지 표현

자바에서 실수 연산은 기본적으로 double타입.

 

2. 소수점 자리수 컨트롤 : %.3f

포맷스트링 사용하여 출력 : printf 

현업에서 쓴지 오래되어 잊고 있던 표현방식..

 

3. 변수명을 case로 했었는데

not a statement 에러가 떴다.

case는 자바 예약어이므로 사용하지 말 것.

 

반응형

'코딩 관련 > 코딩문제풀기' 카테고리의 다른 글

[JAVA] 9012번 괄호  (0) 2023.03.13
[JAVA] 너의 평점은  (0) 2023.03.12
[JAVA] 그룹 단어 체커  (0) 2023.03.12
[JAVA] 크로아티아 알파벳  (0) 2023.03.11
[JAVA] 직사각형에서 탈출  (0) 2023.03.09
반응형

특정 URL을 호출하며 쿠키를 전송하려고 하는데 전송이 안 된다..?

일단 현재 페이지와 호출하려는 URL, 쿠키의 도메인에 따라서 전송가능 여부가 달라진다.

 

확인해야 할 사항

현재 페이지의 도메인, 프로토콜 &  호출하려는 URL의 도메인, 프로토콜 확인

  쿠키 전송 방향 도메인 프로토콜 쿠키 전송 가능 여부
1 https://site.example.com https://site.example.com 같음 같음 그냥 됨
2 https://site.example.com http://site.example.com 같음 다름 크로스 사이트로 간주함.
교차스킴 정책 참고
3 https://site.example.com  https://site.test.com 다름 같음 크로스 사이트로 간주함.
교차스킴 정책 참고
4 https://site.test.com https:// site.example.com 다름 다름 크로스 사이트로 간주함.
교차스킴 정책 참고

* 크로스 사이트(cross-site) 
  호출하는 URL이 도메인이 다른경우 혹은 http, https 와 같이 사용하는 프로토콜(scheme)이 다른 사이트의 경우
* 서드파티 쿠키
  사용자가 접속한 페이지와 다른 도메인에서 발행한 쿠키
* 퍼스트파티 쿠키
  사용자가 접속한 페이지의 도메인에서 발행한 쿠키

 

일반적으로 크로스 사이트(Cross-site)로의 쿠키전송은 안 됨. 서드파티 쿠키전송이 안 됨.

하지만 쿠키의 SameSite 속성 설정으로 서드파티 쿠키 전송을 가능하게 할 수 있다. 

 

* SameSite 속성
  SameSite 속성은 크로스사이트 요청에서 쿠키 전송을 제한하는 기능을 한다.

 

 

쿠키 생성 시 SameSite 속성 설정하는 예시

javascript

document.cookie = "mycookie=testContent; domain=example.com; Path=/; SameSite=None; Secure;"

 

JAVA

@RequestMapping(value = "/test/setCookieTest")
	public HttpServletResponse setCookieTest(HttpServletRequest request, HttpServletResponse response) throws Exception {
	String cookieValue = "CookieTest=CookieTest; Max-Age=3600; Path=/; SameSite=Lax";  
	Domain="example.com;";
	response.addHeader("Set-Cookie", cookieValue);
	return response;
}

 

SameSite 속성값 설명
none none으로 설정된 쿠키의 경우 크로스 사이트 요청의 경우에도 항상 전송됨
Secure 속성을 꼭 함께 붙여줘야 함
Strict 크로스 사이트 요청에는 항상 전송되지 않음
Lax 몇 가지 예외적인 요청에만 전송됨
예)
<a>를 클릭해서 이동
windows.location.replace 로 자동으로 이동
302 리다이렉트를 통한 이동
<iframe>이나 <img>를 삽입할 때 발생되는 http 요청은 쿠키 전송 안 됨.

 

samesite 속성이 Lax이거나 None이며 secure 속성도 넣었는데 전송이 안된다면...?

아래 교차스킴 정책을 참고해보자..

 

반응형

 

교차스킴 유형에 따른 쿠키 전송 정책

* 교차스킴
URL이 모두 동일한 등록 가능 도메인(예: site.example)을 가지고 있지만 
스킴(프로토콜)은 서로 다르며(예: http://site.example과 https://site.example), 이를 교차 스킴이라고 한다.

2020년 이후로 구글에서 교차스킴에 대한 쿠키전송 정책을 변경한다고 했다.
이제 도메인이 같아도 프로토콜이 다르면 크로스사이트로 간주한다 이말인듯

아래의 교차 스킴 유형에 따라 쿠키 전송을 위한 SameSite 속성값이 다름..

 

1) case 1 - Navigation

페이지 이동하는 경우라고 생각하면 될 듯하다.
하이퍼링크를 클릭해서 페이지를 이동하거나
<a>를 클릭해서 이동하거나 windows.location.replace 로 자동으로 이동하거나,
302 리다이렉트를 통한 이동을 포함함.
쿠키의 SameSite 값에 따라 쿠키가 전송될수도, 안 될수도 있다.

 

2) case 2 - 하위 리소스 요청

페이지 내에서 iframe이나 script, fetch, XMLHttpRequest를 통해 url을 요청하는 경우

 

3) case3 - POST양식 submit

form데이터를 POST 전송하는 경우이다.

 

아무리 정리해봐도 넘 헷갈리는...

틀린 부분이 있으면 댓글로 알려주십셔

 


참고

https://web.dev/i18n/en/schemeful-samesite/

 

Schemeful 동일 사이트

"동일 사이트"의 정의는 URL 체계를 포함하도록 진화하고 있습니다. 따라서 사이트의 HTTP와 HTTPS 버전 간의 링크는 이제 크로스 사이트 요청으로 계산됩니다. 가능한 한 문제를 방지하기 위해 기

web.dev

https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content

 

Mixed content - Web security | MDN

When a user visits a page served over HTTPS, their connection with the web server is encrypted with TLS and is therefore safeguarded from most sniffers and man-in-the-middle attacks. An HTTPS page that includes content fetched using cleartext HTTP is calle

developer.mozilla.org

 

반응형
반응형

JAVA로 

HttpServletRequest를 받을 때 charset을 설정하는 방법

request.setCharaterEncoding("charset이름");

@RequestMapping(method = RequestMethod.POST,path = "/result")
public String result(HttpServletRequest request, HttpServletResponse response,Model model) {
        try {
            request.setCharacterEncoding("EUC-KR"); 
            HashMap<String, String> map = new HashMap<>();
            map.put("P_STATUS", request.getParameter("P_STATUS"));
            map.put("P_RMESG1", request.getParameter("P_RMESG1"));
        }catch(Exception e){
            e.printStackTrace();
        }
        return "form";
}
반응형
반응형

@Autowired 로 주입한 객체가 null이라고 뜨는 경우

-> 의존성 주입이 제대로 되지 않음.

 

객체를 @Autowired로 주입한 클래스를

new로 생성하였는지 확인한다. 

-> 클래스를 new로 생성하지 말고 @Autowired로 주입시켜 사용하자.

 

참고))

https://rimkongs.tistory.com/256

 

[Spring] @Autowired 한 class가 null로 나오는 문제 해결법 (Spring 의존성 주입 문제)

우리는 보통 bean에 의존성 주입을 하고 싶을 때, @Autowired 를 사용하는데요. @Autowired한 class 가 null 이 나왔다는 건, 해당 클래스에 의존성 주입이 제대로 이루어지지 않았다는 것입니다. Spring에서

rimkongs.tistory.com

 

반응형
반응형

1. dependencies

jpa 의존성과 postgreSQL 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.postgresql:postgresql'

 

2. application.yml

spring:
##JPA 설정정보
  jpa:
    hibernate:  
      ddl-auto: update  	##update로 해놔야 테이블 update가 됨
      format_sql: true      
      naming:				
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
	##entity를 camelCase로 작성시 db에는 snake_case로 컬럼명이 들어가게 되는데 이걸 막기위함.

##POSTGRESQL 연결정보
  datasource:
    maximum-pool-size: 4
    url: jdbc:postgresql://${HOST}:5432/mydatabase
    username: ${USERNAME}
    password: ${PASSWORD}
    driver-class-name: org.postgresql.Driver

 

 

3. entity 작성

@Entity 어노테이션이 필요하다.

@Table 어노테이션으로 맵핑할 db의 테이블 이름을 적어준다. 

import org.springframework.stereotype.Component;

import javax.persistence.*;
import java.util.Date;

@Component
@Table(name = "member")  //맵핑할 db의 table 이름
@Entity(name = "member")
public class Member {

    @Id //기본 키 매핑
    @GeneratedValue(strategy = GenerationType.AUTO) //자동증가
    private long idx;
    private Date regDate;
    private String age;
    
    public long getIdx() {
        return idx;
    }
    public void setIdx(long idx) {
        this.idx = idx;
    }
    public Date getRegDate(){
        return regDate;
    }
    public void setRegDate(Date regDate){
        this.regDate = regDate;
    }
    public String getAge(){
        return age;
    }
    public void setAge(String age){
        this.age = age;
    }
}

 

반응형

4. db에 CRUD할 repository 작성

JpaRepository를 상속받고

@Repository 어노테이션을 적어준다.

여기서는 insert만 할거라 save만 적어줌

import kr.co.dominos.order.payment.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;


@Repository
public interface MemberRepository extends JpaRepository<Member,String> {
    Member save(Member member);
}

 

5. controller로 테스트

import kr.co.dominos.order.payment.entity.Member;
import kr.co.dominos.order.payment.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;


@RestController
@RequestMapping(value="api")
public class ApiController {

   @Autowired
    MemberRepository memberRepository;

   @Autowired
   Member member;

    @RequestMapping(method = RequestMethod.POST,path = "/save")
    public String savtest() {
        member.setAge("123123");
        Date today = new Date();
        member.setRegDate(today);

        try {
            memberRepository.save(member);
        }catch(Exception e){
            e.printStackTrace();
        }
        return "okok";
    }
}

 

이외에 다른 db config나 jpa config는 하지 않았음.

반응형
반응형

javax가 import가 안 될때가 있다.

Cannot resolve symbol ~ 

방법 : 아래처럼 javax 대신 jakarta로 import

 

자바9부터는 javax 대신 jakarta로 쓰면 된다.

 

참고

https://www.samsungsds.com/kr/insights/java_jakarta.html

[자카르타EE에서는 자바 네임스페이스가 Jakarta로, API 패키지명은 javax.* 에서 Jakarta.* 로 변경되었습니다.]

 

Java EE에서 Jakarta EE로의 전환

Java EE에서 Jakarta EE로의 전환

www.samsungsds.com

 

반응형
반응형

* Redis
- 데이터를 디스크에 쓰는 구조가 아니라 메모리에서 데이터를 처리 => 속도 빠름
- 서버 장애등으로 redis 종료 될 시 데이터 유실이 발생할 수 있음
- 한 번에 하나의 명령만 처리할 수 있음
- Redis Cluster를 사용하면 여러개의 redis를 두어 분산처리를 할 수 있음


* String, Lists, Sets, Sorted Sets, Hashes 자료 구조를 지원함
- String : 가장 일반적인 key & value 
- Sets : key & 여러 값이 들어간 value 
- Sorted Sets : 중복된 데이터를 담지 않는 Set 구조
- Lists : Array 형식의 데이터 구조

 

* Redis Cluster
여러 노드간 데이터를 자동으로 분할하는 기능 .
각기 다른 서버를 하나로 묶어 
데이터를 여러대의 장비에서 처리한다.
서버일부분이 장애가 일어나도 다른 서버의 보완을 통해 서비스를 계속 이어 나갈수 있다.

레디스  GUI 툴 

https://redis.com/redis-enterprise/redis-insight/

 

RedisInsight | The Best Redis GUI

RedisInsight provides an intuitive and efficient graphical interface for Redis, allowing you to interact with your databases and manage your data.

redis.com

 

 

Springboot 어플리케이션에서 redis 사용하기

 

1. 의존성 추가 

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

 

2. application.properties 에 redis 서버정보 추가

spring.data.redis.host=localhost
spring.data.redis.port=6379

 

3. RedisConfig.java

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;

@Configuration
public class RedisConfig {

   @Value("${spring.data.redis.host}")
   private String host;

   @Value("${spring.data.redis.port}")
   private int port;

   @Value("${spring.data.redis.password}")
   private int password;

   @Bean
   public RedisConnectionFactory redisConnectionFactory() {
	RedisStandaloneConfiguration redisConfiguration = new RedisStandaloneConfiguration();
	redisConfiguration.setHostName(host);
	redisConfiguration.setPort(port);
	redisConfiguration.setPassword(password);
	LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisConfiguration);

       return new LettuceConnectionFactory;
   }
   
   @Primary
   @Bean
   public RedisTemplate<String, String> redisTemplate() {
       RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
       redisTemplate.setConnectionFactory(redisConnectionFactory());
       redisTemplate.setKeySerializer(new StringRedisSerializer());
       redisTemplate.setValueSerializer(new StringRedisSerializer());
       return redisTemplate;
   }

}

RedisTemplate : 트랜잭션을 지원한다. 트랜잭션으로 묶게 되면 트랜잭션 내부에서 하나의 로직이 실패하여 오류가 나는 경우 수행한 작업을 모두 취소시킨다.

 

4. RedisService.java

import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;


@Service
@RequiredArgsConstructor
public class RedisService {
   private final RedisTemplate redisTemplate;


   public String getValues(String key){
       //opsForValue : Strings를 쉽게 Serialize / Deserialize 해주는 Interface
       ValueOperations<String, String> values = redisTemplate.opsForValue();
       return values.get(key);
   }



   public void setValues(String key, String value){
       ValueOperations<String, String> values = redisTemplate.opsForValue();
       values.set(key,value);
   }

   public void setSets(String key,String... values){
       redisTemplate.opsForSet().add(key,values);
   }

   public Set getSets(String key){
       return redisTemplate.opsForSet().members(key);
   }



}

 

5. RedisController.java

api를 만들어서 데이터를 넣고 요청해보었다.

import com.dominos.pilot_3.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.sql.Timestamp;
import java.util.Set;

@Controller
public class RedisController_ {
//레디스 테스트

    @Autowired
    RedisService redisService;

    @RequestMapping(value = "/redis/test/setString")
    @ResponseBody
    public void setValue(String testkey, String testvalue){
        Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis());
        redisService.setValues(testkey,testvalue);
    }

    @RequestMapping(value = "/redis/test/getString")
    @ResponseBody
    public String getValue(String testkey){
        return redisService.getValues(testkey);
    }


    @RequestMapping(value = "/redis/test/setSets")
    @ResponseBody
    public void setSets(String testkey,String... testvalues){
        redisService.setSets(testkey,testvalues);
    }

    @RequestMapping(value = "/redis/test/getSets")
    @ResponseBody
    public Set getSets(String key){
        return redisService.getSets(key);
    }

}

123123123는 Key와 123123123이라는 Value 쌍을 넣어봤다.

settest라는 Key와 ["settestvalue1","settestvalue2"] 라는 Value 쌍을 넣어봤다.

 

 

Redis Cluster를 사용하는 경우의 설정

1. application.yml

spring:
 data:
  redis:
    cluster:
      nodes:
        - xx.xx.xx.xxx:6379
        - xx.xx.xx.xxx:6380
    password: xxxxxxxxxx

 

2. RedisClusterConfigurationProperties.java

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
@ConfigurationProperties(prefix = "spring.data.redis.cluster")
public class RedisClusterConfigurationProperties {
   List<String> nodes;

   public List<String> getNodes() {
       return nodes;
   }

   public void setNodes(List<String> nodes) {
       this.nodes = nodes;
   }

}

 

3. RedisConfig.java

import com.dominos.pilot_3.component.RedisClusterConfigurationProperties;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@EnableRedisRepositories
@RequiredArgsConstructor

public class RedisConfig {

   @Autowired
   RedisClusterConfigurationProperties clusterProperties;

   @Bean
   public RedisConnectionFactory redisConnectionFactory() {
       RedisClusterConfiguration redisConfig = new RedisClusterConfiguration ();
       clusterProperties.getNodes().forEach(s ->{
           String[] url = s.split(":");
           redisConfig.clusterNode(url[0],Integer.parseInt(url[1]));
       });
       redisConfig.setPassword("xxxxxxxx");
       return new LettuceConnectionFactory(redisConfig);
   }

   @Primary
   @Bean
   public RedisTemplate<String, Object> redisTemplate() {
       RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
       redisTemplate.setConnectionFactory(redisConnectionFactory());
       redisTemplate.setKeySerializer(new StringRedisSerializer());
       redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
       return redisTemplate;
   }

}

이하 데이터를 넣고 빼는 service와 controller는 동일함.

반응형
반응형

Intellij 환경변수 등록하기

 

1. 왼쪽 위의 메뉴중 Run > Edit Configurations 

혹은 오른쪽위에서 어플리케이션 이름을 클릭해서 Edit Configurations를 들어가서

 

2. Spring Boot Application 선택  > Environment variables 란이 없는 경우 Modify options 선택

Environment variables를 선택해서 환경변수칸을 추가한다.

 

3. 환경변수 옵션칸에서 오른쪽 아이콘 클릭

 

여기서 추가하면 댐 

아래 체크는 시스템환경변수 포함할건지 말건지 여부 체크 

반응형
반응형

SpringBoot에서 SNS로 메세지 발행하기

SQS로 받은 메시지 Springboot에서 받아보기

개발환경 : Intellij, java17, gradle

 

1. 의존성 설정

    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'


    implementation 'com.google.code.gson:gson:2.9.0'
    implementation platform('software.amazon.awssdk:bom:2.15.0')
    implementation group: 'org.springframework.cloud', name: 'spring-cloud-aws-messaging', version: '2.2.1.RELEASE'
    implementation 'software.amazon.awssdk:sns'
    implementation 'software.amazon.awssdk:sqs'
    implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

 

 

2. application.yml

${AWS_ACCESSKEY} 는 intellij 환경변수에 등록해서 사용함

intellij 환경변수  추가는 https://mchch.tistory.com/282 참고

cloud:
  aws:
    credentials:
      access-key: ${AWS_ACCESSKEY}
      secret-key: ${AWS_SECRETKEY}
    region:
      static: ap-northeast-1
      auto: false
    stack:
      auto: false

    sns:
      topic:
        arn: arn:aws:sns:ap-northeast-1:34243243247:MyTopic2

    sqs:
      queue:
        name: MyQueue2
        url: https://sqs.ap-northeast-1.amazonaws.com/34243243247/MyQueue2

 

 

3. AWSConfig.java

@Getter
@Configuration
public class AWSConfig {
    @Value("${cloud.aws.credentials.access-key}")
    private String awsAccessKey;

    @Value("${cloud.aws.credentials.secret-key}")
    private String awsSecretKey;

    @Value("${cloud.aws.region.static}")
    private String awsRegion;

    @Value("${cloud.aws.sns.topic.arn}")
    private String snsTopicARN;

    @Bean // SNS Client 세팅
    public SnsClient getSnsClient() {
        return SnsClient.builder()
                .credentialsProvider(
                        getAwsCredentials(this.awsAccessKey, this.awsSecretKey)
                ).region(Region.of(this.awsRegion))
                .build();
    }

	//aws credential 세팅
    public AwsCredentialsProvider getAwsCredentials(String accessKeyID, String secretAccessKey) {
        AwsBasicCredentials awsBasicCredentials = AwsBasicCredentials.create(accessKeyID, secretAccessKey);
        return () -> awsBasicCredentials;
    }

    @Bean // SQS Client 세팅
    public AmazonSQS amazonSQS() {
        AWSCredentials credentials = new BasicAWSCredentials(awsAccessKey, awsSecretKey);
        return AmazonSQSAsyncClientBuilder
                .standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withRegion(awsRegion)
                .build();
    }
}

 

 

4. SnsService.java

지정한 topic으로 메세지 발행하는 서비스

@Service
@RequiredArgsConstructor
public class SnsService {
    private final AWSSnsConfig awsConfig;

    public PublishResponse awsSnsPublishTest(Map<String,Object> scriptData) {
        PublishRequest publishRequest = PublishRequest.builder()
                .topicArn(awsConfig.getSnsTopicARN())
                .subject("TEST 제목")
                .message(scriptData.toString())
                .build();

        SnsClient snsClient = awsConfig.getSnsClient();
        PublishResponse publishResponse = snsClient.publish(publishRequest);

        snsClient.close();
        return publishResponse;
    }
}

 

 

5. SqsService.java

sns 토픽에서 메세지 가져오는 sqs서비스

@Service
public class SqsService {
    private final QueueMessagingTemplate queueMessagingTemplate;

    @Autowired
    public SqsService(AmazonSQS amazonSqs) {
        this.queueMessagingTemplate = new QueueMessagingTemplate((AmazonSQSAsync) amazonSqs);
    }

    public void getMessage() {
        String rr = queueMessagingTemplate.receiveAndConvert("MyQueue2", String.class);
        System.out.println("queue message :: " + rr );

    }
}

 

 

6. SqsListener.java

@Component
public class SqlListener {
    @SqsListener(value = "MyQueue2", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
    public void listen(@Payload String sst, Acknowledgment ack) {
        log.info("{}", sst);
        ack.acknowledge();
    }
}

 

 

7. Controller.java 

서비스 호출 controller.

@RestController
@RequiredArgsConstructor
@RequestMapping("api")
public class SnsController {
    private final SnsService snsService;
    private final SqsService sqsService;

	//메세지 발행 메소드
    @PostMapping("/publish")
    public void publish(@RequestBody Map<String, Object> scriptData) {
        PublishResponse pr = snsService.awsSnsPublishTest(scriptData);
        System.out.println(pr);
        //PublishResponse(MessageId=80da361c-4ec9-55f5-9aa8-6a49037995af)

    }

	//메세지 가져오는 메소드
    @GetMapping("/subscribe")
    public void getMessage() {
        sqsService.getMessage();
    }
}

 

가져온 메세지 콘솔출력

반응형

+ Recent posts