Field Injection은 Spring Framework와 같은 의존성 주입(Dependency Injection) 프레임워크에서 사용되는 주입 방법 중 하나입니다. Field Injection은 클래스의 멤버 변수 (필드)에 어노테이션을 사용하여 의존성을 주입하는 방식입니다. 예를 들어, @Autowired 어노테이션을 사용하여 필드에 의존성을 주입하는 것이 Field Injection의 예입니다.

Field Injection이 좋지 않은 이유는 다음과 같습니다:

  1. 의존성이 숨겨짐: Field Injection을 사용하면 의존성이 클래스의 필드에 직접 주입되므로, 이를 클래스의 생성자나 메서드 매개변수를 통해 명시적으로 주입하는 것보다 의존성이 숨겨질 수 있습니다. 이로 인해 클래스의 의존성 관계가 명확하지 않고, 코드의 가독성과 유지보수성이 저하될 수 있습니다.
  2. 테스트 어려움: Field Injection을 사용하면 테스트 시 해당 필드에 대한 의존성을 주입하기 어려울 수 있습니다. 특히 단위 테스트에서 이 필드에 대한 가짜 (모의) 의존성을 주입하거나 값을 모의하는 것이 어려울 수 있습니다.
  3. 의존성 주입 순서 문제: Field Injection은 의존성 주입 순서에 따른 문제를 일으킬 수 있습니다. 예를 들어, 필드를 초기화하기 위해 다른 의존성이 먼저 주입되어야 하는 경우, 순서 문제로 인해 예기치 않은 동작이 발생할 수 있습니다.
  4. 클래스에 직접 접근: Field Injection을 사용하면 클래스의 필드에 직접 접근이 가능하므로, 클래스 내부의 상태를 변경하거나 다른 객체와 상호작용하는 부분에서 의존성 주입을 통제하기 어려워질 수 있습니다.
  5. 의존성 관리 어려움: Field Injection을 사용하면 클래스가 여러 개의 의존성을 가질 때 어떤 의존성이 주입되었는지 명확하게 파악하기 어려울 수 있습니다.

그러므로, 대부분의 경우에는 Constructor Injection 또는 Setter Injection과 같은 명시적인 의존성 주입 방법을 사용하는 것이 권장됩니다. 이러한 방식을 사용하면 의존성 관리와 테스트 용이성을 향상시키고, 코드의 가독성을 향상시킬 수 있습니다. Field Injection은 간단한 코드에서는 사용될 수 있지만, 대규모 또는 복잡한 프로젝트에서는 피하는 것이 좋습니다.

반응형

T000000001 T000000002 T000000003 T000000004 T000000005 ... 의 유형에서 한개씩 늘어나게 코딩 하는 자바 코드

 

public class NextString {
    public static String getNextString(String currentString) {
        String prefix = currentString.substring(0, 1); // 문자열의 첫 글자 (여기서는 "T") 추출
        int number = Integer.parseInt(currentString.substring(1)); // 숫자 부분 추출 후 정수로 변환

        // 다음 문자열을 만들기 위해 숫자 부분에 1을 더하고, 다시 문자열로 변환
        String nextNumber = String.format("%09d", number + 1);

        // 다음 문자열을 반환
        return prefix + nextNumber;
    }

    public static void main(String[] args) {
        String currentString = "T000000001"; // 입력된 문자열
        String nextString = getNextString(currentString); // 다음 문자열 계산
        System.out.println(nextString); // 결과 출력
    }
}

반응형
  1. Generative Adversarial Networks (GANs): GANs은 이미지를 생성하는 데 사용되는 딥러닝 모델 중 하나입니다. 이 모델은 생성자와 판별자라는 두 개의 신경망으로 구성되어 있으며, 서로 경쟁하면서 고품질의 이미지를 생성합니다.
  2. Convolutional Neural Networks (CNNs): CNNs은 이미지 인식 및 생성에 널리 사용되는 딥러닝 모델입니다. 이러한 모델은 이미지의 특징을 추출하고, 그림을 그리거나 이미지를 분류하는 데 사용될 수 있습니다.
  3. Variational Autoencoders (VAEs): VAEs는 이미지 생성을 위한 확률적 생성 모델로 사용됩니다. 이 모델은 잠재 공간에서 이미지를 생성하고, 실제 이미지와 유사한 샘플을 생성할 수 있습니다.
  4. Pix2Pix: Pix2Pix는 이미지 변환에 사용되는 딥러닝 모델 중 하나입니다. 이 모델은 입력 이미지를 다른 스타일의 이미지로 변환하는데 사용될 수 있으며, 예를 들어 세그먼테이션, 색칠, 스타일 변환 등에 사용될 수 있습니다.
  5. OpenAI의 DALL-E: DALL-E는 텍스트 설명을 받아들여 그에 맞는 이미지를 생성하는데 사용되는 딥러닝 모델입니다. 이 모델은 텍스트에 기반하여 상상력이 풍부한 그림을 생성할 수 있습니다.
반응형

'궁금증' 카테고리의 다른 글

B2B , B2C 뭐가 다른거야?  (0) 2024.04.29
태양열 에너지를 획득하는 구조  (0) 2024.04.29

클로드의 예시

import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;

import com.example.model.Data;

public class WebClientExample {

    public static void main(String[] args) {
        WebClient webClient = WebClient.create("http://example.com");

        Data data = new Data("Sample Data");

        webClient.post()
                .uri("/api/data")
                .contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(data))
                .retrieve()
                .bodyToMono(String.class)
                .map(ResponseEntity::ok)
                .onErrorResume(WebClientResponseException.class,
                        ex -> ex.getRawStatusCode() == 404 ? Mono.just(ResponseEntity.notFound().build()) : Mono.error(ex))
                .subscribe(response -> handleResponse(response));
    }

    private static void handleResponse(Object response) {
        System.out.println("Response received: " + response);
    }
}

 

이를 응용 하여 

 

@Configuration 에 빈으로 등록

 

private HttpClient httpClientConfig(int sec){
    int timeOut = sec * 1000;
    return HttpClient.create()
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, timeOut)
            .responseTimeout(Duration.ofMillis(timeOut))
            .doOnConnected(conn -> conn
                    .addHandlerLast(new ReadTimeoutHandler(timeOut, TimeUnit.MILLISECONDS))
                    .addHandlerLast(new WriteTimeoutHandler(timeOut, TimeUnit.MILLISECONDS)));
}

private ExchangeStrategies exchangeStrategiesConfig(){
    ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder()
            .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(1024*1024*50))
            .build();
    exchangeStrategies
            .messageWriters().stream()
            .filter(LoggingCodecSupport.class::isInstance)
            .forEach(writer -> ((LoggingCodecSupport)writer).setEnableLoggingRequestDetails(true));

    return exchangeStrategies;
}

private ExchangeFilterFunction logRequest(){
    return ExchangeFilterFunction.ofRequestProcessor(
            clientRequest -> {
                log.debug("Request: {} {}", clientRequest.method(), clientRequest.url());
                clientRequest.headers().forEach((name, values) -> values.forEach(value -> log.debug("{} : {}", name, value)));
                return Mono.just(clientRequest);
            }
    );
}

private ExchangeFilterFunction logResponse(){
    return ExchangeFilterFunction.ofResponseProcessor(
            clientResponse -> {
                log.debug("Response: {}", clientResponse.statusCode());
                clientResponse.headers().asHttpHeaders().forEach((name, values) -> values.forEach(value -> log.debug("{} : {}", name, value)));
                return Mono.just(clientResponse);
            }
    );
}

@Bean(name = "testWebClient")
    public WebClient testWebClient() {
        return WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(httpClientConfig(15)))
                .baseUrl("http://localhost:8080")
                .exchangeStrategies(exchangeStrategiesConfig())
                .filter(logRequest())
                .filter(logResponse())
                .build();

    }

 

어쩌다보니 필터 로깅 하는 거까지 하게 됬습니다.

 

 

 

@Service
@RequiredArgsConstructor
@Slf4j
public class Client {
    private final WebClient testWebClient;

    public Mono<String> testWebClient(final MultiValueMap<String, HttpEntity<?>> formData) {
        return testWebClient.post()
                .uri(uriBuilder -> uriBuilder
                        .path("/test")
                        .build())
                .contentType(MediaType.MULTIPART_FORM_DATA)
                .bodyValue(formData)
                .retrieve()
                .bodyToMono(String.class)
                .doOnNext(responseBody -> log.debug("Body: {}", responseBody.trim()));
    }
}

 

 

빈으로 등록한 웹클라이언트를 가져와서 서비스코딩 해주고

 

MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();

formData.add("subject", "테스트");

client.testWebClient(formData, fsr.contentLength()).subscribe(
                        responseString -> { //이하생략

 

 

반응형

가와사키병은 일본에서 처음 발견된 바이러스에 의한 감염성 질환입니다. 이 병은 일본의 가와사키 시에서 1967년에 처음 보고되어 그 이름을 따서 지어졌습니다. 주로 영유아와 어린이에게 영향을 미치며, 주요 증상은 고열, 발진, 눈의 충혈, 입안의 작은 궤양 등이 있습니다.

 

가와사키병의 원인은 여전히 명확히 알려지지 않았지만, 바이러스나 환경 요인이 관련되어 있다고 여겨집니다. 현재까지는 가와사키병을 완전히 예방하는 백신은 개발되지 않았습니다. 그러나 일부 산과나 병원에서 추천하는 예방 방법이 있습니다:

 

  1. 규칙적인 손씻기: 손씻기는 모든 전염병을 예방하는 가장 기본적이고 효과적인 방법 중 하나입니다. 특히 음식을 만들거나 먹기 전, 화장실을 다녀온 후, 코를 풀거나 기침, 재채기 후에는 손씻기를 해야 합니다.
  2. 감염된 사람과의 접촉 피하기: 가와사키병 환자와 접촉을 피하는 것이 중요합니다. 특히 발진이 있는 사람과의 접촉을 피해야 합니다.
  3. 호흡기 감염 예방: 가와사키병은 호흡기를 통해 전파될 수 있으므로, 사람들 간에 기침이나 재채기를 할 때는 입과 코를 가리는 등의 예방 수단을 취해야 합니다.
  4. 공동 사용 물품의 사용을 피하기: 학교나 어린이집 등에서 공동으로 사용되는 장난감이나 용품은 가능한한 개인용으로 구비하고, 정기적으로 청소해야 합니다.
  5. 영양 균형있는 식사: 영양이 풍부한 식사는 아이들의 면역력을 높일 수 있습니다. 신선한 과일과 채소를 섭취하고, 충분한 수분을 섭취하는 것이 중요합니다.

가와사키병은 주로 겨울과 봄철에 유행하기 때문에 이 기간에 특히 주의를 기울여야 합니다. 만약 어린이가 발진, 고열 및 다른 증상을 보인다면, 가능한 빨리 의료 전문가의 진료를 받아야 합니다.

 

반응형

MySQL: MySQL에서는 LIKE 검색을 위해 SQL 쿼리에서 다음과 같이 사용합니다.이 쿼리는 "your_column"이라는 컬럼에서 "keyword"를 포함하는 모든 레코드를 선택합니다.

 

<select id="selectByKeyword" parameterType="String" resultType="YourResultType">

SELECT * FROM your_table WHERE your_column LIKE CONCAT('%', #{keyword}, '%')

</select>

 

Oracle: Oracle에서는 LIKE 검색을 위해 다음과 같이 사용합니다.이 쿼리는 "your_column"이라는 컬럼에서 "keyword"를 포함하는 모든 레코드를 선택합니다. Oracle에서는 문자열 연결 연산자로 "||"를 사용합니다.

 

<select id="selectByKeyword" parameterType="String" resultType="YourResultType">

SELECT * FROM your_table WHERE your_column LIKE '%' || #{keyword} || '%'

</select>

 

MSSQL: MSSQL에서는 다음과 같이 LIKE 검색을 수행할 수 있습니다.이 쿼리는 "your_column"이라는 컬럼에서 "keyword"를 포함하는 모든 레코드를 선택합니다. MSSQL에서는 문자열 연결을 위해 "+"를 사용합니다.

 

<select id="selectByKeyword" parameterType="String" resultType="YourResultType">

SELECT * FROM your_table WHERE your_column LIKE '%' + #{keyword} + '%'

</select>

반응형

B2C와 B2B는 두 가지 다른 유형의 비즈니스 모델을 나타냅니다.

  1. B2C (Business-to-Consumer):
    • B2C는 기업과 소비자 간의 관계를 나타냅니다.
    • 이 모델에서 기업은 제품이나 서비스를 개인 소비자에게 직접 판매합니다.
    • 일반적으로 대부분의 소매업체, 온라인 쇼핑몰, 서비스 제공 업체 등이 B2C 비즈니스 모델을 채택합니다.
    • 예를 들어, 온라인 의류 쇼핑몰에서 개인 소비자가 옷을 구매하는 것이 B2C의 예입니다.
  2. B2B (Business-to-Business):
    • B2B는 기업 간의 관계를 나타냅니다.
    • 이 모델에서 기업은 다른 기업에 제품이나 서비스를 판매합니다.
    • 대부분의 제조업체, 도매업체, 기술 및 소프트웨어 회사 등이 B2B 비즈니스 모델을 사용합니다.
    • 예를 들어, 소프트웨어 회사가 다른 기업에게 소프트웨어 라이센스를 판매하는 것이 B2B의 예입니다.

간단히 말해서, B2C는 기업과 개인 소비자 간의 거래를 나타내고, B2B는 기업 간의 거래를 나타냅니다. 이러한 모델들은 각각 다른 시장과 고객층을 대상으로 하며, 비즈니스 전략과 마케팅 방법이 서로 다를 수 있습니다.

반응형

'궁금증' 카테고리의 다른 글

그림을 그릴수 있는 인공지능 AI 종류  (0) 2024.05.13
태양열 에너지를 획득하는 구조  (0) 2024.04.29

태양열 에너지를 획득하는 구조는 태양광 시스템을 사용합니다. 이 시스템은 주로 태양광 패널이라는 장치를 사용합니다. 태양광 패널은 일반적으로 다음과 같은 구성 요소로 이루어져 있어요.

  • 태양전지(솔라셀): 태양광 패널의 가장 중요한 부분이에요. 태양전지는 태양의 빛을 전기로 변환하는 역할을 합니다. 이 솔라셀은 일반적으로 실리콘 소재로 만들어져 있어요.
  • 프레임(프레임워크): 태양전지를 지지하고 보호하기 위한 구조물입니다. 프레임은 주로 알루미늄이나 강철로 만들어져 있어요.

 

  • 유리판(강화유리): 태양광 패널을 보호하고 외부 요소로부터 안전하게 유지하기 위한 투명한 판입니다. 유리판은 태양광 패널의 앞쪽에 위치하며, 고효율의 태양광 성능을 유지하는 데 도움이 됩니다.

 

  • 역률 변환 장치(인버터): 태양광 패널에서 생성된 직류 전기를 가정이나 전력 그리드에 연결할 수 있는 교류 전기로 변환하는 장치입니다. 이 장치는 발전된 전기를 일정한 전압과 주파수로 유지하고 에너지 효율성을 최적화하는 역할을 합니다.

 

태양광 패널은 일반적으로 지붕이나 대규모 태양광 발전 시설의 표면에 설치되어 태양의 에너지를 직접 수집합니다. 수집된 에너지는 인버터를 통해 교류 전기로 변환되어 건물 내 전력 네트워크에 공급되거나 전력 그리드에 연결되어 주변 지역에 전력을 공급합니다.

반응형

'궁금증' 카테고리의 다른 글

그림을 그릴수 있는 인공지능 AI 종류  (0) 2024.05.13
B2B , B2C 뭐가 다른거야?  (0) 2024.04.29

요즘 부하가 걸릴정도의 트레픽을 다루는 서비스를 유지보수 하는일을 하고있다.

동접자가 6000까지 올라갈 정도로 인기? 가많은 서비스 인데 업데이트 실수가 있었다.

 

 범인은 바로 index .... 

 

쿼리 튜닝에 있어 index 는 기본중에 기본인데 오늘 새로 알았던 사실을 적어본다.

 

left join on 사용자정보.userId= 주문정보.userId

 

이런식의 조인 결과가 있었는데 

 

테이블 구조는 이렇다.

 

사용자 정보 테이블

 

주문정보

 

대충 이러한 구조인데 ... 이상한점을 금방 눈치차린 사람도 있겠지만 ... 초반에는 아무런 생각조차 못하고 있었다

 

물론 사용자테이블의 userId 는 기본키라 인덱스가 걸려있었고

주문테이블의 userId 는 인덱스 생성을 한 상태

 

당연히 인덱스끼리의 조인이라 별 문제 없을줄 알았으나 이는 slowquery 를 유발 했다

 

explain 으로도 엄청난 자원을 소모 하고 있었고 그이유는 타입 int 형과 타입 char 의 서로 상이한 타입과의 조인 이었다.

 

사용자테이블의 userId 는 int, 주문테이블의 사용자 아이디는 varchar 여서 서로 문제가 되었다.

 

이는 CAST 함수를 사용해서 해결 했다.

 

left join on CAST(사용자정보.userId AS CHAR)= 주문정보.userId

 

조인하는 한쪽을 형변환 하여 조인 하니 index 가 잘 걸리는 것을 확인 하였다.

 

cast 함수를 찾아보니

 

CAST(value AS datatype)

https://www.w3schools.com/sql/func_mysql_cast.asp

인자값은 다양하게 지원 하고 있는것을 확인 했다.

 

다음에 요기나게 사용 해볼수 있을 듯

반응형

+ Recent posts