# Karta ćwiczenia laboratoryjnego

[![Java](https://img.shields.io/badge/Java-ED8B00?style=for-the-badge&logo=openjdk&logoColor=white)](https://www.java.com/)
[![Spring Boot](https://img.shields.io/badge/Spring_Boot-6DB33F?style=for-the-badge&logo=springboot&logoColor=white)](https://spring.io/projects/spring-boot)
[![Spring Data JPA](https://img.shields.io/badge/Spring_Data_JPA-6DB33F?style=for-the-badge&logo=spring&logoColor=white)](https://spring.io/projects/spring-data-jpa)
[![H2 Database](https://img.shields.io/badge/H2_Database-1A237E?style=for-the-badge&logo=databricks&logoColor=white)](https://www.h2database.com/html/main.html)
[![Thymeleaf](https://img.shields.io/badge/Thymeleaf-005F0F?style=for-the-badge&logo=thymeleaf&logoColor=white)](https://www.thymeleaf.org/)
[![Maven](https://img.shields.io/badge/Maven-C71A36?style=for-the-badge&logo=apachemaven&logoColor=white)](https://maven.apache.org/guides/index.html)


## 📋 Informacje podstawowe

| Pole | Wartość |
| --- | --- |
| Przedmiot | Spring |
| Forma zajęć | laboratorium |
| Ćwiczenie | Lab. 6 / Spring Configuration Properties |
| Data | 27.06.2026 |
| Nazwisko i imię studenta | ...................................................... |
| Rok/semestr | Rok 3, semestr 6 [studia niestacjonarne] |
| Ocena | ocena cząstkowa |
| Uwagi do ćwiczenia | **brak** |

## 📝 Opis zadania laboratoryjnego
W projekcie (folder `src_Spring_Lab6`) dostarczonym razem z tą karą zaimplementowano przykład reprezentujący Spring Configuration Properties. W projekcie znajdują się 3 pliki: ConfigDemoApplication, MyAppProperties, application.properties. Umieść poniżej każdy z plików oraz kolorem czerwonym opisz działanie i istotne elementy kodu programu.

## 📦 Wymagania

Kod każdego z trzech plików projektu wraz z opisem należy umieścić w sekcji **KOD PROGRAMU - REALIZACJA** tego pliku.
Opis działania i istotnych elementów kodu należy wpisać **kolorem czerwonym** (np. `<span style="color:red">...</span>`).
Plik `.md` należy dodać do projektu.

Całość należy spakować do formatu `.zip`:

`WSZIB_R3IN_NazwiskoImie_Spring_Lab6.zip`

W miejscu `NazwiskoImie` należy wpisać swoje nazwisko i imię (uwaga na kolejność).
Wynik pracy w formie archiwum `zip` powinien zawierać:
 - folder `Program` z projektem Spring Boot (zawartość folderu `src_Spring_Lab6`),
 - uzupełniony ten plik tj. `.md`.

Archiwum `WSZIB_R3IN_NazwiskoImie_Spring_Lab6.zip` należy uzupełnić o swoje dane w nazwie i przesłać poprzez:

[![Upload](https://img.shields.io/badge/Upload-upload.pelo.com.pl-blue?style=for-the-badge&logo=upload&logoColor=white)](https://upload.pelo.com.pl)

## 🎯 Ogólny opis zadania

Celem zadania jest zapoznanie się z mechanizmem **Spring Configuration Properties** — sposobem mapowania właściwości z pliku `application.properties` na pola obiektu Javy oraz ich walidacji.

W dostarczonym projekcie (folder `src_Spring_Lab6`) aplikacja Spring Boot wczytuje grupę właściwości z prefiksem `myapp` do klasy `MyAppProperties` oznaczonej adnotacją `@ConfigurationProperties`. Wartości obejmują pola proste (`name`, `version`, `enabled`), obiekt zagnieżdżony (`server` z polami `host` i `port`) oraz listę (`admins`). Po uruchomieniu aplikacja w komponencie `CommandLineRunner` wypisuje wczytaną konfigurację na konsolę.

Klasa `MyAppProperties` wykorzystuje walidację (Jakarta Validation / Hibernate Validator) — m.in. `@NotBlank`, `@Pattern`, `@NotEmpty`, `@Email`, `@Min`, `@Max` oraz `@Valid` dla obiektu zagnieżdżonego. Adnotacja `@Validated` na klasie aktywuje sprawdzanie poprawności właściwości przy starcie aplikacji.

Zadaniem studenta jest **przeanalizowanie i opisanie** działania trzech plików projektu:
- `ConfigDemoApplication.java` — klasa startowa z `CommandLineRunner`,
- `MyAppProperties.java` — klasa właściwości z walidacją,
- `application.properties` — plik z wartościami konfiguracji.

## ✅ Wymagania funkcjonalne

| Kod wymagania | Wymaganie | Poziom |
| --- | --- | --- |
| WF-01 | Aplikacja wczytuje właściwości z prefiksem `myapp` z pliku `application.properties` do klasy `MyAppProperties`. | wysoki |
| WF-02 | Klasa właściwości mapuje pola proste (`name`, `version`, `enabled`), obiekt zagnieżdżony `server` (`host`, `port`) oraz listę `admins`. | wysoki |
| WF-03 | Właściwości są walidowane (`@NotBlank`, `@Pattern`, `@NotEmpty`, `@Email`, `@Min`, `@Max`, `@Valid`) dzięki adnotacji `@Validated`. | wysoki |
| WF-04 | Komponent `CommandLineRunner` wypisuje wczytaną konfigurację na konsolę po starcie aplikacji. | wysoki |
| WF-05 | Każdy z trzech plików został opisany kolorem czerwonym (działanie i istotne elementy kodu). | wysoki |

## 🔧 Wymagania niefunkcjonalne

| Kod wymagania | Wymaganie | Poziom |
| --- | --- | --- |
| WNF-01 | Aplikacja wykorzystuje Spring Boot z zależnościami `spring-boot-starter`, `jakarta.validation-api` oraz `hibernate-validator`. | wysoki |
| WNF-02 | Kod jest czytelny, poprawnie sformatowany i podzielony na pliki (klasa startowa, klasa właściwości, plik konfiguracyjny). | średni |
| WNF-03 | Struktura projektu jest zgodna z konwencją Spring Boot (Maven). | średni |
| WNF-04 | Archiwum `.zip` zawiera folder `Program` z projektem oraz uzupełniony ten plik `.md`. | wysoki |

## 🧩 Diagram klas

```mermaid
classDiagram
    class ConfigDemoApplication {
        +main(String[] args) void
        +run(MyAppProperties props) CommandLineRunner
    }
    class MyAppProperties {
        -String name
        -String version
        -boolean enabled
        -Server server
        -List~String~ admins
        +getName() String
        +getVersion() String
        +isEnabled() boolean
        +getServer() Server
        +getAdmins() List~String~
    }
    class Server {
        -String host
        -int port
        +getHost() String
        +getPort() int
    }

    MyAppProperties *-- Server : zawiera
    ConfigDemoApplication --> MyAppProperties : @Bean / wstrzykiwanie
```

**Legenda diagramu:**

| Symbol | Opis |
| --- | --- |
| `──>` (linia ciągła) | Zależność — wstrzykiwanie `MyAppProperties` do metody `@Bean` |
| `*--` (kompozycja) | Klasa zagnieżdżona `Server` jest częścią `MyAppProperties` |


## <span style="color:red">💻 KOD PROGRAMU - REALIZACJA</span>

### JAVA (ConfigDemoApplication.java)
```java
// Wklej tutaj kod Java
```
<span style="color:red">Opis działania i istotnych elementów kodu:</span>

### JAVA (MyAppProperties.java)
```java
// Wklej tutaj kod Java
```
<span style="color:red">Opis działania i istotnych elementów kodu:</span>

### PROPERTIES (application.properties)
```properties
# Wklej tutaj zawartość pliku application.properties
```
<span style="color:red">Opis działania i istotnych elementów pliku:</span>

## 🏆 Ocena [wypełnia prowadzący]

### Ocena kodu

| Kryterium | Opis | Punkty (max) | Punkty uzyskane |
| --- | --- | --- | --- |
| K-01 | Wszystkie trzy pliki zostały umieszczone w karcie. | 2 | |
| K-02 | Poprawny opis klasy `ConfigDemoApplication` (start aplikacji, `CommandLineRunner`). | 2 | |
| K-03 | Poprawny opis klasy `MyAppProperties` (`@ConfigurationProperties`, walidacja, obiekt zagnieżdżony, lista). | 3 | |
| K-04 | Poprawny opis pliku `application.properties` (mapowanie prefiksu `myapp`, lista, obiekt zagnieżdżony). | 2 | |
| K-05 | Opisy wykonane kolorem czerwonym, czytelne i poprawne merytorycznie. | 1 | |
| **Suma** | | **10** | |

### Ocena końcowa

| Pole | Wartość |
| --- | --- |
| Ocena (2–5) | |
| Uwagi prowadzącego | |
| Data wystawienia oceny | |
| Podpis prowadzącego | |

