본문 바로가기

기타 보관함/개발자정보

Spring 개발자 교육

반응형

 제목 슬라이드

  • 주제: Spring 기반 백엔드 개발 교육
  • 부제: React+TypeScript 프론트엔드와의 연동을 중심으로
  • 교육 대상: 초중급 Spring 개발자

목차 슬라이드

  1. 아키텍처 개요
  2. 프로젝트 구조 설명
  3. 주요 컴포넌트 상세
  4. end-to-end 예제 흐름
  5. 모범 사례와 주의점

1. 아키텍처 개요 슬라이드

전체 흐름도:

[React+TS] → [Spring Controller] → [Service] → [Mapper] → [iBatis/SQLMap] → [MariaDB]
       ↑_______________________________↓

계층별 역할:

  • Controller: HTTP 요청 처리, 입력 검증
  • Service: 비즈니스 로직 구현
  • Mapper: 데이터 액세스 추상화
  • SQLMap: SQL 쿼리 정의

2. 프로젝트 구조 슬라이드

표준 디렉토리 구조:

src/
├── main/
│   ├── java/
│   │   └── com/example/
│   │       ├── controller/
│   │       ├── service/
│   │       ├── mapper/
│   │       └── dto/
│   ├── resources/
│   │   ├── sqlmaps/ (iBatis XML)
│   │   └── application.properties
└── test/

의존성 예제 (pom.xml/gradle):

<!-- Spring Boot Web -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- MyBatis (iBatis 호환) -->
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.2.0</version>
</dependency>

<!-- MariaDB -->
<dependency>
  <groupId>org.mariadb.jdbc</groupId>
  <artifactId>mariadb-java-client</artifactId>
</dependency>

3. 주요 컴포넌트 상세 슬라이드 (예제 포함)

Controller 예제

@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping("/{id}")
    public ResponseEntity<UserResponse> getUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.getUserById(id));
    }
    
    @PostMapping
    public ResponseEntity<UserResponse> createUser(
        @Valid @RequestBody UserCreateRequest request) {
        return new ResponseEntity<>(userService.createUser(request), HttpStatus.CREATED);
    }
}

Service 예제

@Service
@RequiredArgsConstructor
public class UserService {
    
    private final UserMapper userMapper;
    
    public UserResponse getUserById(Long id) {
        User user = userMapper.findById(id)
            .orElseThrow(() -> new ResourceNotFoundException("User not found"));
        return convertToResponse(user);
    }
    
    // 비즈니스 로직 메서드들...
}

Mapper 인터페이스 예제

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    Optional<User> findById(@Param("id") Long id);
    
    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(User user);
}

SQLMap XML 예제 (iBatis)

<!-- src/main/resources/sqlmaps/UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
    <select id="findActiveUsers" resultType="User">
        SELECT * FROM users WHERE status = 'ACTIVE'
    </select>
</mapper>

4. end-to-end 예제 흐름 슬라이드

사용자 조회 시퀀스 다이어그램:

  1. React → /api/users/123 GET 요청
  2. Controller → userService.getUserById(123) 호출
  3. Service → userMapper.findById(123) 호출
  4. Mapper → SQLMap의 SELECT 쿼리 실행
  5. MariaDB → 결과 반환
  6. 응답이 역순으로 전달되어 React에 JSON 반환

5. 모범 사례와 주의점 슬라이드

권장 사항:

  • DTO 패턴 사용 (Request/Response 분리)
  • 서비스 계층에서 트랜잭션 관리 (@Transactional)
  • 적절한 예외 처리 계층 구현
  • API 버저닝 전략 수립

주의점:

  • N+1 쿼리 문제 방지
  • 지연 로딩 주의 (Open Session In View 패턴)
  • 대용량 데이터 페이징 처리
  • API 보안 고려 (인증/인가)

마무리 슬라이드

  • 요약: 계층별 역할 분리를 통한 유지보수성 향상
  • 추가 학습 자료: Spring Boot 공식 문서, MyBatis 문서
  • Q&A

부록 샘플 슬라이드 (실제 PPT에는 여러 장으로 분할)

React에서 호출 예제 (TypeScript)

async function fetchUser(userId: number): Promise<User> {
  const response = await fetch(`/api/users/${userId}`);
  if (!response.ok) {
    throw new Error('User not found');
  }
  return response.json();
}

// 사용 예제
fetchUser(123).then(user => {
  console.log('User data:', user);
});

DTO 클래스 예제

public class UserCreateRequest {
    @NotBlank
    private String name;
    
    @Email
    private String email;
    
    // getters, setters
}

public class UserResponse {
    private Long id;
    private String name;
    private String email;
    // getters, setters
}

.

반응형