2025/01: 29개의 글

AI 에이전트 협력 워크플로우

Posted by nkjok
2025. 1. 29. 01:53 낙서장[2]/낙서
반응형

에이전트 AI 워크플로는 정의된 규칙이나 목표 내에서 독립적으로 작업을 수행하고, 의사 결정을 내리고, 변화하는 조건에 적응할 수 있는 자율적인 AI 에이전트로 구동되는 프로세스이다

 

[예제]

AI 에이전트의 협력 구조를 명의 담당자가 여러 AI 에이전트를 지시하여 작업을 분배한다

AI 에이전트들은 각기 다른 역할을 수행하며, 협력하여 작업을 진행할 있다. 이는 단순한 자동화 작업을 넘어서, 복잡한 프로젝트 관리까지 도울 있다. 글에서는 담당자가 인공지능 팀을 지휘하여, 분석, 계획, 실행을 효과적으로 수행하는 구조를 설명하고자 한다.

 

AI 에이전트 협력 구조의 개념과 필요성

  • AI 에이전트 협력 구조란?: 하나의 작업을 여러 AI 에이전트들이 서로 협력하여 수행하는 방식이다. AI 에이전트는 특정 역할을 맡아 협업을 통해 문제를 해결한다.
  • 필요성: 구조는 업무 효율성을 높이고, 오류를 줄이며, 단계에서 전문가의 도움 없이도 효과적으로 작업을 진행할 있는 이점을 제공한다.

AI 에이전트 협력 워크플로우

  1. 요구사항 전달: 담당자는 전체 프로젝트의 요구사항을 분석 에이전트(AI)에게 전달한다.
    • 예시: 담당자가 고객 수요 분석 보고서를 작성해야 한다고 가정한다.
  2. 분석 에이전트(AI)의 데이터 분석: 분석 에이전트는 고객 데이터를 수집하고 분석하여 인사이트를 도출한다.
    • 분석 에이전트: 데이터 수집, 세분화된 분석, 패턴 인식 등을 담당한다.
    • 결과: 분석 보고서를 PM 에이전트에게 전달한다.
  3. PM 에이전트(AI)의 계획 수립: PM 에이전트는 분석 에이전트가 제출한 자료를 바탕으로 상세한 계획을 수립하고, 작업을 분담한다.
    • PM 에이전트: 프로젝트 관리, 일정 수립, 자원 배분 등을 담당한다.
    • 결과: 작업 목록과 일정표를 엔지니어 AI들에게 전달한다.
  4. 엔지니어 AI들의 작업 수행: 엔지니어 AI들 각각은 PM 에이전트가 할당한 작업을 수행한다.
    • 엔지니어 AI들: 특정 도구를 사용해 실제 작업을 수행한다(예: 데이터 시각화, 보고서 작성 등).
    • 결과: 작업 결과물을 PM 에이전트에게 보고한다.

 AI 에이전트 협력 구조의 적용 사례

  • 고객 수요 분석 프로젝트:
    1. 담당자가 고객 데이터 분석을 분석 에이전트에게 지시한다.
    2. 분석 에이전트는 고객 데이터를 수집하고, 트렌드를 분석하며, 인사이트를 도출한다.
    3. PM 에이전트는 이러한 인사이트를 바탕으로 프로젝트 계획을 수립하고, 엔지니어 AI들에게 작업을 할당한다.
    4. 엔지니어 AI들은 각기 맡은 바를 수행하여, 계획된 작업을 완료한다. 예를 들어, 하나의 엔지니어 AI는 데이터 시각화를, 다른 하나는 보고서 작성 작업을 맡을 있다.     
반응형

[Java] 배열을 거꾸로 출력하기

Posted by nkjok
2025. 1. 24. 19:51 낙서장[1]/91. Java
반응형

public class ReverseArray {
    public static void main(String[] args) {
        int[] array = { 1, 2, 3, 4, 5 };
        // 배열 요소를 거꾸로 출력하는 코드 작성
        for (int i = array.length - 1; i >= 0; i--) {
            System.out.printf(array[i] + "");
        }

    }

}

출력결과: 54321

배열을 거꾸로 출력하는 코드를 작성하기 위해 for 루프를 사용한다. 여기서 i는 배열의 길이만큼 정의하여 배열의 마지막 인덱스를 가리킬 수 있다. 배열의 길이가 5이므로 i는 처음에 4가 되며, 배열 인덱스 4에서 시작하게 된다(배열의 인덱스는 0부터 시작하기 때문).

루프는 i가 0보다 크거나 같은 동안 계속 반복되며, 각 반복마다 i를 1씩 감소시킨다(i--). 이렇게 함으로써 인덱스 4부터 0까지 차례로 역순으로 순회할 수 있다.

루프 내에서는 array[i]가 현재 인덱스에 해당하는 배열 요소를 가리키며, 이를 출력하여 배열의 요소들을 거꾸로 나열할 수 있다. 이 방식으로 배열의 마지막 요소부터 첫 번째 요소까지 역순으로 출력할 수 있다.

( int[] array = { 1, 2, 3, 4, 5 };에서 array.length는 배열의 길이를 반환한다. 이 배열의 길이는 5다.  배열의 인덱스는 0부터 시작하니까, 마지막 요소의 인덱스는 array.length - 1이 된다. 즉, array.length는 5이고, 마지막 요소의 인덱스는 5 - 1 = 4 이다.)

※ 아래는 배열의 요소들을 역순이 아닌 정상적으로 출력하는 코드이다.


public class ReverseArray {
    public static void main(String[] args) {
        int[] array = { 1, 2, 3, 4, 5 };
        for (int i = 0; i < array.length; i++) {
            System.out.printf(array[i] + "");
        }

    }

}

출력결과: 12345

반응형

[JAVA] 람다식(Lambda Expression): 정의, 용도, 사용 방법 및 예시

Posted by nkjok
2025. 1. 24. 18:09 낙서장[1]/91. Java
반응형

Java 람다식(Lambda Expression): 정의, 용도, 사용 방법 및 예시

1. 람다식(Lambda Expression)의 정의

람다식은 익명 함수(Anonymous Function)를 생성하기 위한 표현식이다. 이는 메소드의 구현을 단순하고 간결하게 작성할 수 있도록 도와준다. Java 8부터 도입된 람다식은 함수형 프로그래밍 스타일을 지원하며, 코드의 가독성과 유지보수성을 향상시킨다.

2. 람다식의 용도

  • 간결한 코드: 불필요한 코드(익명 클래스 등)를 줄이고, 간결하게 표현할 수 있다.
  • 함수형 인터페이스: 람다식은 함수형 인터페이스(Single Abstract Method Interface)를 구현할 때 유용하다.
  • 스트림 API: Java 스트림 API와 함께 사용하여 컬렉션 데이터의 필터링, 매핑, 집계 등을 간편하게 처리할 수 있다.

3. 람다식의 사용 방법

람다식의 기본 형태는 (parameters) -> expression 또는 (parameters) -> { statements; }이다.

  • 매개변수가 하나인 경우: parameter -> expression
  • 매개변수가 여러 개인 경우: (parameter1, parameter2) -> expression
  • 코드 블록이 포함된 경우: (parameters) -> { statements; }

4. 람다식 예시

람다식을 사용하여 다양한 상황에서 코드의 간결성을 살펴보자.

4.1. Runnable 인터페이스 구현

익명 클래스를 사용한 Runnable 인터페이스 구현:

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, world!");
    }
};

 

람다식을 사용한 Runnable 인터페이스 구현:

Runnable runnable = () -> System.out.println("Hello, world!");

 

4.2. Comparator 인터페이스 구현

익명 클래스를 사용한 Comparator 인터페이스 구현:

Comparator<String> comparator = new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
};

람다식을 사용한 Comparator 인터페이스 구현:

Comparator<String> comparator = (s1, s2) -> s1.compareTo(s2);

 

4.3. 스트림 API와 람다식

스트림 API와 람다식을 사용하여 리스트의 요소를 필터링하고, 매핑하고, 집계하는 예시:

List<String> names = Arrays.asList("John", "Jane", "Tom", "Alice");
List<String> filteredNames = names.stream()
                                  .filter(name -> name.startsWith("J"))
                                  .collect(Collectors.toList());

filteredNames.forEach(System.out::println);

위 예시에서 filter(name -> name.startsWith("J")) 부분이 람다식을 사용한 코드야. 이는 리스트의 각 요소가 "J"로 시작하는지 필터링하는 역할을 한다.

반응형

[DataBase] 조인 SQL문

Posted by nkjok
2025. 1. 24. 15:53 낙서장[1]/94. DataBase
반응형

1. LEFT JOIN

LEFT JOIN은 왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드를 반환한다. 왼쪽 테이블에 일치하는 레코드가 없으면 NULL 값을 포함한 레코드를 반환한다.

sql
SELECT * FROM TableA A LEFT JOIN TableB B ON A.key = B.key;

2. INNER JOIN

INNER JOIN은 두 테이블 간의 일치하는 레코드만 반환한다. 일치하는 레코드가 없으면 결과에 포함되지 않는다.

sql
SELECT * FROM TableA A INNER JOIN TableB B ON A.key = B.key;

3. RIGHT JOIN

RIGHT JOIN은 오른쪽 테이블의 모든 레코드와 왼쪽 테이블의 일치하는 레코드를 반환한다. 오른쪽 테이블에 일치하는 레코드가 없으면 NULL 값을 포함한 레코드를 반환한다.

sql
SELECT * FROM TableA A RIGHT JOIN TableB B ON A.key = B.key;

4. LEFT JOIN with NULL condition

LEFT JOIN에 WHERE 조건을 추가하여 오른쪽 테이블에 일치하지 않는 레코드만 반환한다.

sql
SELECT * FROM TableA A LEFT JOIN TableB B ON A.key = B.key WHERE B.Key IS NULL;

5. FULL OUTER JOIN

FULL OUTER JOIN은 두 테이블의 모든 레코드를 반환하며, 일치하지 않는 레코드는 NULL 값을 포함한다. SQL에서는 FULL OUTER JOIN을 UNION으로 구현할 수 있다.

sql
SELECT * FROM TableA A LEFT JOIN TableB B ON A.key = B.key
UNION
SELECT * FROM TableA A RIGHT JOIN TableB B ON A.key = B.key;

6. FULL OUTER JOIN with NULL condition

FULL OUTER JOIN에 WHERE 조건을 추가하여 어느 한쪽에 일치하지 않는 레코드만 반환한다.

sql
SELECT * FROM TableA A LEFT JOIN TableB B ON A.key = B.key
UNION
SELECT * FROM TableA A RIGHT JOIN TableB B ON A.key = B.key WHERE A.key IS NULL OR B.key IS NULL;

7. RIGHT JOIN with NULL condition

RIGHT JOIN에 WHERE 조건을 추가하여 왼쪽 테이블에 일치하지 않는 레코드만 반환한다.

sql
SELECT * FROM TableA A RIGHT JOIN TableB B ON A.key = B.key WHERE A.Key IS NULL;

이러한 JOIN 종류를 사용하면 다양한 방식으로 데이터를 결합하고 조회할 수 있다. 상황에 맞게 적절한 JOIN을 선택하여 데이터베이스 쿼리를 작성하면 된다.

 

 

출처: https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-JOIN-%EC%A1%B0%EC%9D%B8-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EA%B8%B0%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC 발췌

반응형

[JPA] Spring Data JPA의 Pageable 인터페이스: 페이징과 정렬을 손쉽게 처리하기

Posted by nkjok
2025. 1. 24. 15:19 낙서장[1]/3. JPA
반응형

Spring Data JPA의 Pageable 인터페이스: 페이징과 정렬을 손쉽게 처리하기

Spring Data JPA에서 페이징과 정렬 기능을 제공하기 위해 Pageable 인터페이스를 사용할 수 있다. 이 글에서는 Pageable 인터페이스의 개념과 사용법을 예시와 함께 살펴보겠다.

1. Pageable 인터페이스란?

Pageable 인터페이스는 스프링 데이터에서 페이징 처리를 위해 사용되는 인터페이스이다. 이를 통해 간단하게 페이지 번호, 페이지 크기, 정렬 방식을 설정하여 데이터베이스 쿼리에 반영할 수 있다.

2. Pageable 인터페이스의 주요 메서드

Pageable 인터페이스는 다음과 같은 주요 메서드를 제공한다:

  • int getPageNumber(): 현재 페이지 번호를 반환한다.
  • int getPageSize(): 페이지당 항목 수를 반환한다.
  • long getOffset(): 페이지의 시작 위치를 반환한다.
  • Sort getSort(): 정렬 방식을 반환한다.

 

3. Pageable 사용 예시

1). Repository 인터페이스에 Pageable 추가:

public interface PostRepository extends JpaRepository<Post, Long> {
    Page<Post> findByWriter(String writer, Pageable pageable);
}

 

2). 서비스 메소드에서 Pageable 사용:

@Service
@RequiredArgsConstructor
public class PostService {
    private final PostRepository postRepository;

    public Page<Post> getPostsByWriter(String writer, int page, int size) {
        Pageable pageable = PageRequest.of(page, size, Sort.by("regDate").descending());
        return postRepository.findByWriter(writer, pageable);
    }
}

 

3).  컨트롤러에서 Pageable 사용  

@RestController
@RequestMapping("/api/v1")
@RequiredArgsConstructor
@Slf4j
public class PostController {
    private final PostService postService;

    @GetMapping("/posts")
    public ResponseEntity<Page<Post>> getPostsByWriter(
            @RequestParam String writer,
            @RequestParam int page,
            @RequestParam int size) {
        Page<Post> posts = postService.getPostsByWriter(writer, page, size);
        return ResponseEntity.ok(posts);
    }
}

위 예시에서는 PostRepository에 findByWriter 메소드가 Pageable을 인자로 받도록 정의했고, PostService에서 PageRequest.of 메소드를 사용하여 Pageable 객체를 생성하여 Repository에 전달했다. 그리고 PostController에서 해당 메소드를 호출하여 결과를 반환하고 있다.

4. Pageable의 장점

  • 간편한 페이징 처리: 페이지 번호, 페이지 크기, 정렬 방식을 쉽게 설정하여 데이터베이스 쿼리에 적용할 수 있다.
  • 유연한 정렬 방식: Sort 객체를 사용하여 여러 필드에 대한 정렬 방식을 설정할 수 있다.
  • 직관적인 API: Pageable 인터페이스를 사용하여 페이징과 정렬을 간단하게 처리할 수 있다.

5. 결론

Pageable 인터페이스는 Spring Data JPA에서 페이징과 정렬 기능을 손쉽게 구현할 수 있게 해주는 강력한 도구이다. 이를 통해 데이터베이스 쿼리에 페이징과 정렬을 간편하게 적용하여 효율적인 데이터 처리를 할 수 있다.

반응형