반응형
제목 슬라이드
- 주제: Spring 기반 백엔드 개발 교육
- 부제: React+TypeScript 프론트엔드와의 연동을 중심으로
- 교육 대상: 초중급 Spring 개발자
목차 슬라이드
- 아키텍처 개요
- 프로젝트 구조 설명
- 주요 컴포넌트 상세
- end-to-end 예제 흐름
- 모범 사례와 주의점
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 예제 흐름 슬라이드
사용자 조회 시퀀스 다이어그램:
- React → /api/users/123 GET 요청
- Controller → userService.getUserById(123) 호출
- Service → userMapper.findById(123) 호출
- Mapper → SQLMap의 SELECT 쿼리 실행
- MariaDB → 결과 반환
- 응답이 역순으로 전달되어 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
}
.
반응형
'기타 보관함 > 개발자정보' 카테고리의 다른 글
회사 내부의 폐쇄망(오프라인 환경)에서 자체적으로 AI 모델을 설치하고 학습한 후 서비스할 수 있는 방법 (1) | 2025.04.26 |
---|---|
AI 중 로컬 PC에서 다운 받아 별도 학습하여 별도의 서비스를 만들 수 있는 AI (0) | 2025.04.26 |
Spring, iBATIS, MariaDB 환경에서 온라인 서비스와 배치 서비스 구성 가이드 (0) | 2025.04.24 |
DeepSeek의 AI 모델을 활용해 슈퍼에이전트와 같은 지능형 에이전트 플랫폼을 구축하기 (1) | 2025.04.24 |
Windows 환경에서 DeepSeek AI를 Visual Studio Code (VS Code)와 연동 방법 (0) | 2025.04.24 |